ASP.NET Razor Pages生产环境单域名请求延迟排查求助
问题概述
ASP.NET Razor Pages应用在Windows Server 2019(IIS 10)上发布后,单个域名出现显著请求延迟:
- 调试模式运行正常,生产环境每次请求约10秒延迟,每张静态图片额外增加10秒延迟
- 数据库查询耗时<5ms,MiniProfiler显示
Result: PageResult存在明显延迟 - 日志显示
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.RuntimeViewCompiler找到编译视图后,与Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker执行完PageResult之间存在10秒间隙,无中间日志 - 同服务器其他4个域名配置(IIS、web.config、appsettings.json)一致,仅域名和数据库不同,无延迟问题
- 已升级至.NET 8,所有包为最新版本
排查步骤
禁用运行时编译,预编译视图
当前启用了AddRazorRuntimeCompilation(),生产环境建议预编译视图以避免运行时编译的潜在问题:- 修改
Program.cs,移除.AddRazorRuntimeCompilation() - 在项目csproj文件中添加配置:
<MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish> <RazorCompileOnBuild>true</RazorCompileOnBuild> - 重新发布应用,验证延迟是否消失
- 修改
检查文件系统权限
对比正常域名的应用程序池身份权限,确保问题域名的应用池账号对以下路径有完全控制权限:- 网站根目录及子文件夹
- 服务器临时目录(默认
C:\Windows\Temp) - 应用目录下的
obj、bin文件夹
权限不足可能导致运行时编译或静态文件读取阻塞
排查域名解析与静态文件引用
- 将页面中图片的绝对域名引用改为相对路径(如
/images/xxx.png),验证是否减少延迟,排除域名解析阻塞 - 检查服务器本地
hosts文件是否有该域名的异常配置,清理DNS缓存(执行ipconfig /flushdns)
- 将页面中图片的绝对域名引用改为相对路径(如
检查IIS静态文件与请求规则
- 确认问题域名的IIS"静态文件"功能已启用
- 对比正常域名,检查IIS的请求筛选、URL重写、输出缓存规则是否存在针对该域名的特殊配置
- 查看IIS日志(默认路径
C:\inetpub\logs\LogFiles),分析静态文件请求的耗时字段,确认延迟是否发生在静态文件处理阶段
捕获线程栈定位阻塞点
在请求卡住的10秒间隙,使用工具定位阻塞代码:- 打开Process Explorer,找到问题域名对应的
w3wp.exe进程 - 右键进程→Properties→Threads,查看处于等待状态的线程,右键选择Stack Trace,找到阻塞的具体调用
- 或使用Windows Performance Recorder录制请求过程,分析CPU/IO等待事件,定位瓶颈
- 打开Process Explorer,找到问题域名对应的
排查数据库连接隐性延迟
虽然查询耗时短,但连接初始化可能存在延迟:- 将问题域名的数据库连接字符串改为SQL Server身份验证(替代Windows身份验证),验证是否改善
- 检查应用池账号对该数据库的AD域身份验证是否存在延迟(可通过测试直接在服务器上连接数据库验证)
临时禁用Session排查
当前启用了Session和分布式内存缓存,尝试临时移除相关配置:- 在
Program.cs中注释AddDistributedMemoryCache()、AddSession()、UseSession()代码 - 重新发布,验证延迟是否消失,排除Session存储的阻塞问题
- 在
检查服务器安全软件拦截
对比其他域名,检查服务器上的防火墙、杀毒软件、Web应用防火墙(WAF)是否对该域名的请求有额外扫描规则,导致每个请求被延迟10秒。可临时关闭安全软件测试,确认是否为拦截导致
内容的提问来源于stack exchange,提问作者haraman
相关产品推荐
相关产品推荐

