我需要从我的ASP.net Web API调用3方Web Api,当它运行
行时HttpResponseMessage response = await client.PostAsJsonAsync("api/ArTrx/postDocument", poMaster);
网络服务器挂起。我试图将下面的代码放入控制台程序,它运行良好。在ASP.net Web API项目中运行时,下面的代码有什么问题?
client.BaseAddress = new Uri(webAPIAddress);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
string token = Crypto.EncryptStringAES("abcd1234");
client.DefaultRequestHeaders.Add("X-Token", token);
HttpResponseMessage response = await client.PostAsJsonAsync("api/ArTrx/postDocument", poMaster);
if (response.IsSuccessStatusCode)
{
...
}
答案 0 :(得分:2)
您的呼叫堆栈可能会进一步调用Task<T>.Result
或Task.Wait
。我将在我的博客中更详细地描述cause a deadlock on ASP.NET。
总之,await
将捕获&#34;上下文&#34; - 在这种情况下,ASP.NET请求上下文,一次只允许一个正在运行的线程。当等待完成时(即POST结束时),async
方法将在该上下文中继续 。如果您的代码阻塞了调用堆栈(例如,Result
或Wait
),那么它将阻止该ASP.NET请求上下文中的线程,并且async
方法无法进入该上下文继续执行。
您在控制台应用中看不到死锁,因为没有捕获上下文,因此async
方法会在线程池线程上恢复。