我需要从我的 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
方法改为在线程池线程上恢复。
关于c# - 从我的 Web API 调用第 3 方 Web API 时 Web 服务器挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31237989/