我有两种方法进行API调用。第一个巧妙命名的apiCall,完全按照预期工作。我传递一个字符串URL和对象后,在调用时,我收到一个HttpResponseMessage类对象:异步API调用失败
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方法在默认情况下是异步的。从逻辑上讲,我期望(并且看到很多人有这种情况)出现相反的问题。
你需要给你的'client.PostAsJsonAsync()'调用添加一个'await'。正如你所知道的那样,我会想象在'PostAsJsonAsync()'完成之前'HttpClient'已经被放置了。 –