IIS部署Web API调用Azure API报SocketException(10060)超时问题
问题现象
自研Web API调用托管在Azure的外部API时,本地环境运行调用完全正常,部署到服务器IIS后抛出System.Net.Sockets.SocketException (10060)异常,错误信息为:连接尝试失败,因为连接方在一段时间后未正确响应,或是已建立的连接因连接主机无响应而失败。已将请求超时时间上调至5分钟,但连接仍会在21秒时静默中断抛出异常。
业务实现代码
var telemetries = new TelemetryResponse(); var client = httpClientFactory.CreateClient("Lynx"); client.Timeout = TimeSpan.FromMinutes(5); var httpResponseMessage = await client.GetAsync("vehicletelemetries/All?key=iLJIbAVXOnpKz5xyF0zV44yepu5OVfmZFhkHM7x"); if (httpResponseMessage.IsSuccessStatusCode) { string content = await httpResponseMessage.Content.ReadAsStringAsync(); telemetries = JsonConvert.DeserializeObject<TelemetryResponse>(content); }
异常堆栈信息
System.Net.Sockets.SocketException (10060): A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken) at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token) at System.Net.Sockets.Socket.g__WaitForConnectWithCancellation|277_0(AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
根因分析与解决方案
从堆栈可以看到异常发生在ConnectToTcpHostAsync阶段,也就是TCP连接尚未建立完成就失败了,代码中设置的5分钟超时是连接建立后的请求响应超时,对TCP建连阶段不生效,21秒是Windows系统默认的TCP初始连接重传超时时间,和代码配置无关,按以下优先级排查:
- 先验证服务器基础网络连通性:登录部署应用的IIS服务器,直接用浏览器、Postman或
Test-NetConnection命令调用目标Azure API地址,确认是否能正常连通。90%以上的同类问题都是服务器出口防火墙、安全组策略没有放开对应Azure服务的IP、端口访问权限,或者企业内网要求出站请求必须走指定代理但未配置,这种情况直接联系网络管理员开通访问白名单即可,不需要修改业务代码。 - 排查IIS应用池身份权限问题:本地运行时程序使用当前登录用户的网络权限,部署到IIS后默认使用
ApplicationPoolIdentity虚拟账户运行,部分服务器的组策略会限制该虚拟账户的外网访问权限。可以临时将对应应用程序池的标识修改为有外网访问权限的域服务账号测试,如果改完后调用恢复正常,给应用池默认身份开通对应网络权限,或固定使用专用服务账号运行应用即可。 - 排查命名HttpClient配置冲突:检查
Program.cs/Startup.cs中名为Lynx的HttpClient的注册配置,确认基地址是否正确(必须带https://前缀,结尾带斜杠)、是否配置了错误的代理参数、是否存在超时配置覆盖问题。如果服务器不需要走代理访问外网,显式关闭代理使用可以避免系统默认代理探测带来的连接问题,参考配置如下:
builder.Services.AddHttpClient("Lynx", client => { client.BaseAddress = new Uri("https://你的Azure API服务基地址/"); client.Timeout = TimeSpan.FromMinutes(5); }) .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { // 无代理环境下关闭代理配置,避免默认代理探测导致连接失败 UseProxy = false });
- 以上排查都无效的情况下,再检查服务器TCP参数配置:Windows默认TCP初始建连重传超时刚好为21秒,和遇到的中断时间完全吻合,这种情况一般是网络链路存在丢包导致建连包无法送达,优先排查链路问题,不建议直接修改系统TCP参数规避。
内容的提问来源于stack exchange,提问作者Malik
相关产品推荐
相关产品推荐

