ASP.NET长耗时页面请求为何会在客户端永久挂起
ASP.NET Web Forms 长请求超240秒后客户端永久挂起问题
问题背景
本系统为基于C#开发、使用Web Forms(.ASPX页面)构建的传统ASP.NET Web应用,存在部分耗时10-15分钟的长运行请求,后台需执行重型SQL查询与计算,该耗时属于正常业务范围,系统上线运行多年从未出现相关异常。
近期收到用户反馈:运行耗时超10分钟的报表时无法完成下载。用户点击页面按钮触发回传(post back)后,服务端可正常生成报表文件,但客户端始终无法收到响应,浏览器不会弹出文件保存弹窗,页面永久处于加载状态。
复现规律
该故障从未在历史多代部署环境中出现,本地开发环境也无法稳定复现,经多场景交叉测试,复现规则如下:
- 服务端为生产环境(IIS 10、Windows Server 2019),客户端为企业AD域内工作站,使用Chrome/Edge等任意浏览器访问:可复现
- 服务端为生产环境(IIS 10、Windows Server 2019),客户端为企业AD域外计算机,使用Chrome/Edge等任意浏览器访问:无法复现
- 服务端为生产环境(IIS 10、Windows Server 2019),客户端为企业AD域外计算机,使用Postman、发起HTTP请求的C#控制台程序、PowerShell脚本发起请求:可复现
- 服务端为开发机环境(IIS 10、Windows 10),客户端为企业AD域外计算机,使用Chrome/Edge等任意浏览器访问:无法复现
已验证的故障特征
- 触发阈值固定:所有场景下只要HTTP请求耗时超过240-250秒即会触发故障,覆盖三类请求场景:向.ASPX页面发起回传并重载页面部分内容、发起回传后返回文件附件触发浏览器保存弹窗、访问仅返回纯文本响应的测试页面
- 无显性错误提示:故障发生时,浏览器DevTools(F12)、Postman、Fiddler均无异常标识,仅表现为请求挂起、永久处于
pending状态 - 服务端运行正常:已排查所有已知服务端超时配置,均满足长请求运行要求:ASP.NET Session超时设置为60分钟,
httpRuntime配置节点设置executionTimeout=3600,应用程序池(Application Pool)空闲超时设置为0;所有故障触发场景下,服务端进程均可正常完成全部任务逻辑,无运行时异常抛出 - 临时验证结论:长请求运行过程中,若服务端定期调用
Response.Write()和Response.Flush()向客户端发送分块内容,故障不会触发,但该方案无法适配服务端向浏览器返回完整文件附件的业务场景
排查诉求
- 定位故障根本原因,找到可控制该超时挂起行为的服务端配置项
- 提供可落地的规避方案,需覆盖文件附件下载的业务场景
内容的提问来源于stack exchange,提问作者Hristo Atanasov
相关产品推荐
相关产品推荐

