ASP.NET MVC 5网站发布至主机后持续响应缓慢问题求助
这种每请求都卡30秒的情况我碰到过好几次,大概率是某个环节的超时或者环境差异导致的,给你几个具体的排查方向:
先揪出数据库连接的问题
30秒刚好是SQL Server默认的连接超时时间,哪怕你页面看起来没直接操作数据库,说不定全局过滤器、基础控制器里藏着隐性的数据库操作(比如读取站点配置、验证权限)。本地用localhost数据库延迟低,到了服务商那里数据库可能在另一台服务器,网络或者权限出问题就会卡超时。
快速验证方法:把所有数据库相关代码暂时换成硬编码数据,比如ViewModel直接写死内容,看看响应时间会不会正常。如果好了,就重点调试:- 检查连接字符串里的
Connection Timeout是不是30(默认值),改成5秒快速确认是不是连接超时; - 用服务商提供的数据库工具测试从服务器到数据库的连接速度;
- 要是用了Windows身份验证,看看应用池身份有没有数据库访问权限,换成SQL Server身份验证试试。
- 检查连接字符串里的
核对服务器的.NET运行环境
ASP.NET MVC 5要求.NET Framework 4.5及以上,得确认服务商服务器上的.NET版本和你本地完全一致,别是装了旧版本或者漏了补丁。另外,应用池的.NET CLR版本别配错了(比如选了v2.0),这会导致运行异常慢。
顺便看看服务器的CPU、内存使用率,要是资源被占满了也会拖慢所有请求,可以联系服务商要性能监控数据,或者自己在代码里加Stopwatch记录各个步骤的耗时。排查全局/Action过滤器的坑
本地和服务器环境不同,有些过滤器可能在服务器上触发了耗时操作:比如自定义授权过滤器要访问LDAP或者第三方身份服务,网络不通;或者日志过滤器要写文件到慢存储,IO阻塞。
试试暂时禁用所有非必要的全局过滤器,逐个恢复,看哪个一启用就卡30秒,那就是它的问题。确认视图编译模式
要是web.config里compilation节点的debug="true",发布后视图会每次请求都重新编译,加上调试开销肯定慢。一定要改成:<compilation debug="false" targetFramework="4.5" />而且发布的时候要选发布模式,别直接复制文件,这样会预编译视图,避免每次请求编译的开销。
检查后端依赖的外部服务
看看代码里有没有调用第三方服务(比如邮件、缓存、API),服务器到这些服务的网络延迟高或者连接失败重试,也会导致30秒延迟。比如本地能连的Redis,到了服务器上防火墙没开端口,就会一直重试直到超时。启用ASP.NET跟踪日志找瓶颈
在web.config里加这段配置开启跟踪:<system.web> <trace enabled="true" requestLimit="100" pageOutput="false" traceMode="SortByTime" localOnly="false" /> </system.web>然后访问站点的
trace.axd页面,就能看到每个请求从开始到结束的各个阶段耗时,精准定位哪个步骤占了30秒。
内容的提问来源于stack exchange,提问作者Anton Voronin

