从 .net 5 升级到 .net 6 会导致通过 webclient 进行外部 http(s) 调用超时

Upgrading from .net 5 to .net 6 causes timeouts for external http(s) calls via webclient

我们决定将我们的网站 Asp.net 核心代码从 .net5 升级到 .net6,我们只需将 Web 应用程序的 'target framework' 从 .net5 设置为 .net6。没有编译错误,我们在开发环境中进行了测试,一切正常。 根本没有进行任何代码更改,之前 .net5 应用程序已经 运行 好几个月没有问题(在 .net framework 4.8 之前)。

当我们将应用程序部署到实际生产环境时,几分钟内我们注意到外部调用(对 https 端点的调用,通常是类似 REST 的调用)变慢了,我们记录了所有超过 5 秒的调用,在 space 的几分钟内,所有调用都从缓慢变为超时(20 秒)。

我们所有的调用都使用 System.Net.WebClient,据我所知,在 .net6 中 is now obsolete,但是,我不希望这会突然改变行为,即便如此,我们尝试更改为推荐方法 HttpClient,结果相同。

我觉得我一定遗漏了一些非常基本的东西,我们刚刚升级了目标框架并重新部署,现在 WebClient 发出的所有调用最终都超时了。 由于减速然后超时,在代码中感觉像是“运行 资源不足”问题,但我无法解释这里发生了什么。

需要说明的是,我们没有做任何特别的事情,只是通过 WebClient 为每个用户调用大约 3 个外部服务,高峰时我们可能每分钟有 100 个用户,以前没有超时。

任何有关可能导致超时的指示都将不胜感激。

这是可疑的和出乎意料的。如果你有 HttpClient 复制品,你可以 post 它在 GitHub https://github.com/dotnet/runtime/issues 上吗? (理想情况下,我们可以 运行 在本地进行调试的最小重现)

如果您的重现不能转移到另一台机器,或者需要您无法公开的特定端点,我们可能必须指导您完成一些本地调试...

-Karel(.NET 网络团队)

我想时间会证明这是否是 答案,但我们更改了所有调用以使用 DownloadStringTaskAsyncUploadStringTaskAsync,即从阻塞到异步等待的所有调用,24 小时后,我们在满负载的实时环境中没有看到相同的行为。

为什么使用 .net 5 核心的 Web 应用程序不会有这些问题,但 .net 6 会有,这很难理解。就上下文而言,我们并没有承受疯狂的高负载,我们说的是每分钟可能有 150 个用户的峰值,但这就是我们所看到的。

也许这是我们的设置所特有的,但我写这篇文章是为了避免其他人在未来尝试调试此问题的痛苦。