从我的Web API调用第三方Web API时,Web服务器挂起

时间:2015-07-06 04:53:28

标签: c# asp.net asp.net-web-api

我需要从我的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)
{
    ...
}

1 个答案:

答案 0 :(得分:2)

您的呼叫堆栈可能会进一步调用Task<T>.ResultTask.Wait。我将在我的博客中更详细地描述cause a deadlock on ASP.NET

总之,await将捕获&#34;上下文&#34; - 在这种情况下,ASP.NET请求上下文,一次只允许一个正在运行的线程。当等待完成时(即POST结束时),async方法将在该上下文中继续 。如果您的代码阻塞了调用堆栈(例如,ResultWait),那么它将阻止该ASP.NET请求上下文中的线程,并且async方法无法进入该上下文继续执行。

您在控制台应用中看不到死锁,因为没有捕获上下文,因此async方法会在线程池线程上恢复。