小编Jci*_*cis的帖子

从 Azure 中托管的 ASP.NET Core 5.0 MVC 站点调用 API/服务时出现间歇性套接字异常

Application Insights 中的错误消息:

由于连接方在一段时间后未正确响应而导致连接尝试失败,或者由于连接的主机未能响应而建立的连接失败。(OurApiUrlAddress:443) 连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接的主机未能响应而建立的连接失败。

它始终是 21 秒的 TCP 超时,这是我知道的一个非常普遍的错误,但此错误的原因并不总是相同,我一直在阅读有关此问题的所有线程。我们已经调查这个问题几个月了,但没有成功,我们也与 Azure 团队联系。

重要提示:用 RUBY 编写的同一个站点过去使用相同的 API,没有任何问题,该 API 是响应式的,并且从其他站点调用它没有任何问题,但这个特定站点已从 RUBY 迁移到 .NET,同时该网站托管在 AZURE 中,这是 2 个重大变化。当站点(记住它托管在 Azure 中)调用我们公司托管的 API/服务时,就会发生这种情况,当站点调用其他地方托管的服务时,不会发生这种情况,这些使我们认为问题可能与公司基础设施有关但这不可能是单独的,这必须以某种方式与 .NET 和 AZURE 有关,因为这些 API 和服务可以完美地响应来自我们网络中托管的其他站点的调用,并且它们与该站点的 ruby​​ 版本配合良好。从公司网络外部在浏览器中调用时,这些 API 和服务不会抛出此错误。

服务/API 位于防火墙后面,但端口配置完美(没有任何其他流量应用程序或设备在起作用)。

此错误似乎与端口耗尽或 SNAT 无关,因为有时只有 1 个开发人员单独在 DEV 环境中工作,并且他收到此套接字异常错误

仅供参考,我们在生产环境中每天会收到大约 250 个套接字异常,而这只是所有调用的一小部分,因此有时会发生某些事情。

我们知道创建多个实例时存在众所周知的 HttpClient 问题,因此我们决定使用 Singleton 方法,确保每个 API/服务只有 1 个实例,正如我将在此处展示的,这是会产生更多套接字异常的调用:

StartUp在课堂/文件中:

services.AddSingleton<IUploadApi>(new UploadApi(new HttpClient() { BaseAddress = new Uri(appSettings.Endpoints.UploadServicesUrl) }));
Run Code Online (Sandbox Code Playgroud)

部分appsettings.json

"Endpoints": {
    "UploadServicesUrl": "https://ourApiUrlAddress"
},
Run Code Online (Sandbox Code Playgroud)

上传API.cs …

asp.net-mvc azure asp.net-core .net-5

5
推荐指数
1
解决办法
897
查看次数

标签 统计

.net-5 ×1

asp.net-core ×1

asp.net-mvc ×1

azure ×1