调用 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()
解决了它。
谢谢大家!
我目前正在研究一个由 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()
解决了它。
谢谢大家!