IIS ASP.NET WebApi请求同一服务器时出现死锁

时间:2016-09-13 14:42:28

标签: asp.net iis asp.net-web-api2 deadlock identityserver3

在同一IIS服务器上使用互连的ASP.NET WebApis时,我们遇到了一些死锁。我们想知道这是否是某种预期的行为,因为在同一服务器和相同的应用程序池上托管所有API,因为我们已经设法通过将WebApi移动到另一个池来避免这个问题。或者如果我们的代码有问题。

对于生产,我们可能会在不同的服务器或池上托管API,但我们仍然想了解为什么会发生这种情况。我们主要担心的是,如果这是我们错误的代码,即使主机设置正确,问题也可以在更大范围内重现。

我们已经创建了一个小解决方案来重现死锁hosted in GitHub

复制步骤如下:

  1. WebClient并行执行多个HTTP请求WebApi1。
  2. WebApi1对WebApi2执行HTTP请求。
  3. WebApi2对WebApi3执行HTTP请求。
  4. WebApi3只返回一个字符串。
  5. 预期的行为是最终解决所有请求。

    实际行为是,某些请求已完成,而其他一些请求将失败,原因是TaskCancelledException似乎是由于请求超时所致。

    我能找到的唯一一篇文章似乎提到同一个问题是从2014年开始:“Do Not Send ServerXMLHTTP or WinHTTP Requests to the Same Server”,我相信这是我们遇到的问题,我们如何确认?

    上下文

    我们已被分配任务,为我们所在公司的多个内部API创建集中式身份验证服务器。 我们使用带有引用标记的IdentityServer3,因此当某些API使用引用标记请求第二个API时,第二个API将请求验证服务器进行标记验证,以再现该问题。

    我添加了IdentityServer标记,因为在进行多个API通信和使用引用标记时,这可能是一个常见问题。 Sample on GitHub

1 个答案:

答案 0 :(得分:1)

只有一个观察结果:您正在使用HttpClient作为每个Controller的静态成员,并且根据this HttpClient不保证是线程安全的