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

问题描述 投票:2回答:1

当我运行该行时,我需要从我的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)
{
    ...
}
c# asp.net asp.net-web-api
1个回答
2
投票

你可能有一个Task<T>.ResultTask.Wait进一步调用你的调用堆栈。这将是我在博客上更详细描述的cause a deadlock on ASP.NET

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

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

© www.soinside.com 2019 - 2024. All rights reserved.