【发布时间】:2016-03-08 01:29:14
【问题描述】:
我有两种方法可以进行 API 调用。第一个,巧妙地命名为 apiCall,完全按预期工作。我传递了一个字符串 url 和要发布的对象,进行了调用,我收到了一个 HttpResponseMessage 类对象:
public HttpResponseMessage apiCall(string url, object o)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(baseUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = client.PostAsJsonAsync(url, o).Result;
if (response.IsSuccessStatusCode)
{
return response;
}
else
{
throw new Exception(response.ReasonPhrase);
}
}
}
但是,我也有一个用于进行异步调用的方法。它最初被命名为 asyncApiCall,并且是这样构造的:
public void asyncApiCall(string url, object o)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(baseUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.PostAsJsonAsync(url, o);
}
}
如您所见,这是相同的方法,但减去了实际从服务器返回响应的代码。但是,服务器没有收到任何类型的消息。
总结:我的同步调用正常,我的异步调用失败。我想我做错了什么,但我能找到的所有文档都暗示 HttpClient 的 PostAsJsonAsync 方法默认是异步的。从逻辑上讲,我预计(并且已经看到很多人遇到)相反的问题。
【问题讨论】:
-
您需要将
await添加到您的client.PostAsJsonAsync()呼叫中。正如你所拥有的那样,我想HttpClient在你的PostAsJsonAsync()完成之前被处置。
标签: c# asp.net asp.net-web-api2