.NET 6 Minimal Web API部署IIS后10秒连接重置问题排查
问题分析与排查建议
10秒超时的核心来源推测
最可能的原因是ASP.NET Core Module (ANCM)的默认请求转发超时,ANCM作为IIS与Kestrel之间的中间层,默认requestTimeout为10秒。当你的8位设备接收响应耗时超过这个阈值,ANCM会主动断开TCP连接并发送RST包,这和你抓包看到的服务器发起RST的现象完全匹配。
此外,还需排查以下潜在来源:
- IIS站点的连接超时设置(虽默认120秒,但不排除被手动修改为10秒)
- Http.sys内核驱动的空闲连接超时(默认120秒,若被篡改也会触发问题)
- Kestrel未配置的其他超时参数(如请求体接收超时,不过你的场景更偏向响应阶段)
具体排查与修复步骤
步骤1:修改ANCM的请求超时配置
在项目的web.config文件中,找到<aspNetCore>节点,添加或修改requestTimeout属性,设置为足够长的时间(例如5分钟):
<aspNetCore processPath="dotnet" arguments=".\YourProject.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" requestTimeout="00:05:00" />
这是解决当前10秒超时的关键步骤,因为进程内托管模式下,ANCM的超时优先级高于Kestrel的配置。
步骤2:验证并调整IIS站点连接超时
- 打开IIS管理器,定位到你的目标站点
- 右键选择「管理网站」→「高级设置」
- 查看「连接超时」项,确保值不是10秒,建议设置为300秒(5分钟)以上
步骤3:检查Http.sys超时参数
- 以管理员身份打开命令提示符,执行:
netsh http show timeout - 查看
IdleTimeout等参数,若值为10秒,执行以下命令修改(示例为300秒):netsh http set timeout idletimeout=300
步骤4:补充配置Kestrel的相关超时
虽然进程内托管下Kestrel的部分参数被ANCM覆盖,但仍建议补充配置以下参数,覆盖默认值:
builder.WebHost.ConfigureKestrel(serverOptions => { serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(5); serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(5); serverOptions.Limits.RequestBodyTimeout = TimeSpan.FromMinutes(5); // 防止设备发送请求体过慢超时 });
步骤5:启用日志定位问题
- 启用Kestrel详细日志,在
appsettings.json中添加:"Logging": { "LogLevel": { "Microsoft.AspNetCore.Server.Kestrel": "Debug" } } - 启用ANCM日志,修改
web.config的<aspNetCore>节点,设置stdoutLogEnabled="true",日志会生成在指定的stdoutLogFile路径下,可从中查看超时触发的具体阶段。
为什么之前的Kestrel参数无效?
当ASP.NET Core项目以进程内托管模式部署在IIS上时,Kestrel并非直接监听TCP端口,而是由ANCM负责接收请求并转发给Kestrel进程。此时ANCM的超时配置会优先生效,你之前设置的Kestrel参数无法覆盖ANCM的10秒默认超时,因此没有效果。
内容的提问来源于stack exchange,提问作者Psyfun
相关产品推荐
相关产品推荐

