从我的Web API调用第三方Web API时,Web服务器挂起
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从我的Web API调用第三方Web API时,Web服务器挂起相关的知识,希望对你有一定的参考价值。
当我运行该行时,我需要从我的ASP.net Web API调用3方Web Api
HttpResponseMessage response = await client.PostAsJsonAsync("api/ArTrx/postDocument", poMaster);
Web服务器挂起。我试图将下面的代码放入控制台程序,它运行良好。在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)
{
...
}
答案
你可能有一个Task<T>.Result
或Task.Wait
进一步调用你的调用堆栈。这将是我在博客上更详细描述的cause a deadlock on ASP.NET。
总之,await
将捕获一个“上下文” - 在本例中是一个ASP.NET请求上下文,它一次只允许一个正在运行的线程。当它等待完成时(即POST完成时),async
方法将在该上下文中继续。如果您的代码阻塞了调用堆栈(例如,Result
或Wait
),那么它将阻止该ASP.NET请求上下文中的线程,并且async
方法无法进入该上下文以继续执行。
您没有在控制台应用程序中看到死锁,因为没有捕获上下文,因此async
方法在线程池线程上恢复。
以上是关于从我的Web API调用第三方Web API时,Web服务器挂起的主要内容,如果未能解决你的问题,请参考以下文章