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

Leo*_*aia 12 asp.net iis deadlock asp.net-web-api2 identityserver3

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

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

我们已经创建了一个小解决方案来重现在GitHub中托管的死锁.

复制步骤如下:

  1. WebClient在并行WebApi1中执行多个HTTP请求.
  2. WebApi1对WebApi2执行HTTP请求.
  3. WebApi2对WebApi3执行HTTP请求.
  4. WebApi3只返回一个字符串.

预期的行为是最终解决所有请求.

实际行为是,某些请求完成,而其他一些请求将失败,因为TaskCancelledException这似乎是由于请求超时.

我能找到的唯一一篇文章似乎提到同一个问题是从2014年开始:" 不要向同一台服务器发送ServerXMLHTTP或WinHTTP请求 ",我相信这是我们遇到的问题,我们怎样才能确认这一点?

上下文

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

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

小智 1

只是一个观察:您使用 HttpClient 作为每个控制器的静态成员,并且根据HttpClient 不能保证线程安全