调用 HttpClient.PostAsync 时死锁

Deadlock when calling HttpClient.PostAsync


我目前正在研究一个由 2 个应用程序组成的项目,一个基本上是一个休息服务器和一个客户端。在服务器部分似乎一切正常,但在客户端应用程序中 posting 异步时我遇到了死锁。

服务器应用程序中的 post 处理程序目前(使用 Nancy):

Post("/", args =>
     {
         bool updated = false;

         string json = Request.Body.AsString();
         PostData data = JsonConvert.DeserializeObject<PostData>(json);

         int clientCode = data.ClientCode;
         bool started = data.Started;

         // TODO:
         // Update database
                    
        return updated;
    }
);

客户端应用程序的死锁部分是(我还添加了 GET 处理只是为了完整性,但它工作正常):

public async Task<string> Get()
{
    string actualRequest = $"{uri}/{request}";
    response = await client.GetAsync(actualRequest);
    response.EnsureSuccessStatusCode();

    result = await response.Content.ReadAsStringAsync();

    return result;
}

public async Task<string> Post(object data)
    {
    string json = JsonConvert.SerializeObject(data);
    StringContent content = new StringContent(json, Encoding.UTF8, "application/json");

    response = await client.PostAsync(uri, content);
    result = await response.Content.ReadAsStringAsync();

    return result;
}

用于测试的一小段代码是:

private static string response = "";
private static async Task TestPostConnection(RestClient client)
{
    PostData data = new PostData(1, true);
    response = await client.Post(data);
}

private static async Task TestGetConnection(RestClient client)
{
    client.Request = "id=1";
    response = await client.Get();
}

private static async Task InitializeClient()
{
    string ipAddress = "localhost";
    RestClient client = new RestClient("RestClient", new Uri($"http://{ipAddress}:{8080}"));

    await TestGetConnection(client); // OK
    await TestPostConnection(client);
}

可能是我看不到的愚蠢的东西,因为我花了大约 4 个小时来处理它:P

谢谢!


编辑:
我正在使用 .net 框架 (4.7.2),我没有在任何地方调用结果(只是在 Visual Studio 中搜索以进行双重检查)

这是主要方法:

[STAThread]
static async Task Main()
{
    await InitializeClient(); // Call the async methods above

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new ClientForm(response))
}

我刚刚解决了它。
问题是服务器应用程序 post 处理程序的 return 类型

Post("/", args =>
{
        bool updated = false;

        string json = Request.Body.AsString();
        PostData data = JsonConvert.DeserializeObject<PostData>(json);

        int clientCode = data.ClientCode;
        bool started = data.Started;

        // TODO:
        // Update database

        return updated.ToString();
    }
);

我实现的 RestClient.Post() 结果需要一个字符串(实际上是方法 si (async) Task<string> 的类型,但我 return bool)。
添加 ToString() 解决了它。

谢谢大家!