异步 API 调用失败
Asynchronous API call failing
我有两种调用 API 的方法。第一个巧妙地命名为 apiCall,完全按预期工作。我将一个字符串 url 和对象传递给 post,调用已完成,我收到一个 HttpResponseMessage class 对象:
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);
}
}
如您所见,这是相同的方法,只是减去实际 return 来自服务器的响应的代码。但是,服务器没有收到任何类型的消息。
总结:我的同步调用正常,我的异步调用失败了。我想我做错了什么,但我能找到的所有文档都暗示 HttpClient 的 PostAsJsonAsync 方法默认是异步的。从逻辑上讲,我希望(并且已经看到很多人遇到)相反的问题。
这需要等待:
await client.PostAsJsonAsync(url, o);
这意味着这需要 async
:
public async Task asyncApiCall(string url, object o)
{
//...
}
否则可能发生的情况是控制在任务实际执行之前离开 using
块,导致任务失败。 (因为 client
已处理。)并且由于从未等待或检查任务,因此不会在任何地方报告失败。
我有两种调用 API 的方法。第一个巧妙地命名为 apiCall,完全按预期工作。我将一个字符串 url 和对象传递给 post,调用已完成,我收到一个 HttpResponseMessage class 对象:
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);
}
}
如您所见,这是相同的方法,只是减去实际 return 来自服务器的响应的代码。但是,服务器没有收到任何类型的消息。
总结:我的同步调用正常,我的异步调用失败了。我想我做错了什么,但我能找到的所有文档都暗示 HttpClient 的 PostAsJsonAsync 方法默认是异步的。从逻辑上讲,我希望(并且已经看到很多人遇到)相反的问题。
这需要等待:
await client.PostAsJsonAsync(url, o);
这意味着这需要 async
:
public async Task asyncApiCall(string url, object o)
{
//...
}
否则可能发生的情况是控制在任务实际执行之前离开 using
块,导致任务失败。 (因为 client
已处理。)并且由于从未等待或检查任务,因此不会在任何地方报告失败。