我有兩種方法進行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'已經被放置了。 –