c# - 从我的 Web API 调用第 3 方 Web API 时 Web 服务器挂起

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

我需要从我的 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方法改为在线程池线程上恢复。

关于c# - 从我的 Web API 调用第 3 方 Web API 时 Web 服务器挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31237989/

相关文章:

c# - 禁用 asp.net mvc 成员资格和角色表创建

c# - 使用 C# 反射调用构造函数

javascript - 谷歌地图、融合表和标记

c# - UnityPer 请求 Web Api 的 HttpModule?

asp.net - ASP.NET Web API 中除 IQueryable 之外的 OData 查询和类型

c# - 为什么我的 for 循环告诉我我正在将 int 转换为 bool?

c# - 通用处理程序参数大小限制?

c# - 从共享主机上的 asp.net 页面启动控制台应用程序

.net - Web API:HttpResponseMessage中的内容

C# 使用 LINQ 限制递归列表