.NET Core7应用在IIS中挂起,IIS Express及本地版本正常求助
排查.NET Core 7 IIS部署间歇性CPU飙升&请求挂起问题
针对你描述的问题,以下是IIS端重点排查方向:
1. 应用池高级配置校验
- 托管管道模式:必须设置为
集成模式,.NET Core应用不兼容经典模式,会导致请求处理逻辑异常 - 进程模型配置:
- 检查
最大工作进程数:若设置大于1,需确认应用Session是否采用分布式存储(如Redis),InProc Session在多进程下会出现数据不一致,引发认证循环或请求阻塞 - 确认
队列长度(默认1000):若请求量较大,队列溢出会导致请求堆积,CPU飙升 .NET CLR版本:强制设为无托管代码,.NET Core为自托管运行时,无需IIS托管CLR
- 检查
- 身份权限:应用池身份(默认ApplicationPoolIdentity)需对应用发布目录有读写权限,尤其是日志、临时文件目录
2. IIS站点绑定与SSL细节
- 主机名绑定:确认
testapp.domain.ext的绑定无冲突,同一端口下的主机名不能重复;若服务器存在多个HTTPS站点,必须启用服务器名称指示(SNI),否则会出现证书匹配错误,导致请求阻塞 - SSL设置:
- 确认
要求SSL开启,且客户端证书设为忽略(除非业务强制要求,否则客户端证书验证会增加请求开销) - 检查SSL证书的有效性:确认证书包含该域名的SAN(Subject Alternative Name),未过期,且已正确关联到站点绑定
- 确认
- HTTP/HTTPS共存问题:若同时绑定HTTP和HTTPS,需确认应用中是否有强制HTTPS的重写规则,避免出现重定向循环
3. ASP.NET Core模块(web.config)配置检查
- 核心节点校验:
<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />stdoutLogEnabled设为true,开启应用运行日志,检查日志目录是否有读写权限,日志中是否包含未捕获的异常hostingModel:若用InProcess,需确保IIS版本≥10.0.17763(Windows Server 2019默认满足);若用OutOfProcess,确认端口配置无冲突,避免端口被占用导致启动失败
- 检查是否存在自定义重写规则:若有URL重写配置,排查是否存在循环重写(如登录页被反复重定向)
4. 身份验证与Cookie配置冲突排查
- IIS身份验证:仅保留
匿名身份验证,禁用Windows、表单等其他身份验证,避免与.NET Core自带的认证逻辑冲突,引发额外验证开销 - Cookie属性一致性:
- 检查IIS站点
HTTP响应头中的Cookie设置(如SameSite、Secure),是否与Startup.cs中配置的Session/Authentication Cookie属性冲突,冲突会导致Cookie无法正确传递,引发认证循环 - 确认Cookie的
Domain属性配置正确,测试环境域名testapp.domain.ext需与Cookie的Domain匹配,否则Cookie无法跨请求传递
- 检查IIS站点
5. 环境变量与资源配置
- 环境变量校验:通过IIS应用池的
环境变量配置项,确认ASPNETCORE_ENVIRONMENT已正确设置为Testing,环境变量错误会导致加载错误的配置(如Development模式的调试逻辑、错误的数据库连接字符串) - 服务器资源检查:
- 检查服务器CPU、内存是否被其他进程占用,导致应用池资源不足
- 确认SQL Server连接池配置:连接字符串中
Max Pool Size是否合理(默认100),过小的连接池会导致数据库连接等待,引发CPU飙升
6. 诊断工具使用
- 启用IIS失败请求跟踪:配置跟踪规则,捕获持续加载的请求,查看请求在IIS管道中的处理阶段,定位阻塞环节
- 进程转储分析:当CPU飙升时,用
dotnet-dump工具捕获w3wp进程转储,分析线程栈,排查是否存在死锁、无限循环等代码问题 - Process Explorer:实时查看w3wp进程的线程占用情况,定位占用CPU的线程对应的模块或代码
内容的提问来源于stack exchange,提问作者Becca
相关产品推荐
相关产品推荐

