从我的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>.ResultTask.Wait进一步调用你的调用堆栈。这将是我在博客上更详细描述的cause a deadlock on ASP.NET

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

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

以上是关于从我的Web API调用第三方Web API时,Web服务器挂起的主要内容,如果未能解决你的问题,请参考以下文章

从 Web 服务 (ASMX) 调用第三方 API

从另一个 Web api 调用 Web api

为啥我的应用程序无法从我的 API 读取 JSON?

从 WCF 服务调用 Web API 端点

从 wcf 服务调用第三方 Web 服务

即使启用了CORS,Web Api仍会始终发生403错误