如何避免IIS中托管的ASP.NET Core应用周期性自动关闭?
排查ASP.NET Core应用频繁 shutdown的解决方案
1. 检查IIS应用池回收规则
- 打开IIS管理器,找到对应应用池,右键→高级设置
- 查看回收模块:确认“固定时间间隔(分钟)”是否设为合理值(默认1740分钟,若设为短时间会触发频繁回收);关闭“私有内存限制”“虚拟内存限制”的自动回收(避免内存阈值触发回收);检查“最大请求数”是否设置过低
- 查看进程模型→闲置超时(分钟):必须设为0,防止应用因闲置被回收
2. 验证ASP.NET Core模块托管配置
- 检查应用根目录的
web.config中<aspNetCore>节点:<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />- 优先使用
InProcess托管模式(进程内托管),减少进程分离导致的意外回收 - 若使用
OutOfProcess模式,需添加超时配置避免异常关闭:<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="OutOfProcess" startupTimeLimit="300" shutdownTimeLimit="300" />
- 优先使用
3. 抓取详细shutdown原因日志
- 启用ASP.NET Core详细日志:修改
appsettings.json提升日志级别:
查看{ "Logging": { "LogLevel": { "Default": "Debug", "Microsoft.Hosting.Lifetime": "Trace" } } }Microsoft.Hosting.Lifetime相关日志,它会明确输出shutdown触发原因(如应用池回收、闲置超时等) - 检查Windows事件查看器:打开事件查看器→Windows日志→应用程序,筛选
ASP.NET Core或IIS Worker Process来源的事件,定位shutdown相关的警告/错误
4. 优化自调用逻辑
- 替换外部自调用为内部后台服务:用
IHostedService实现定时任务,避免依赖外部请求触发活动检测,示例代码:
在public class KeepAliveService : IHostedService, IDisposable { private readonly ILogger<KeepAliveService> _logger; private Timer _timer; public KeepAliveService(ILogger<KeepAliveService> logger) => _logger = logger; public Task StartAsync(CancellationToken cancellationToken) { _logger.LogInformation("Keep-alive service started"); _timer = new Timer(RunTask, null, TimeSpan.Zero, TimeSpan.FromMinutes(30)); return Task.CompletedTask; } private void RunTask(object state) { _logger.LogInformation("Executing keep-alive task at {Time}", DateTimeOffset.Now); // 此处执行原自调用的业务逻辑 } public Task StopAsync(CancellationToken cancellationToken) { _logger.LogInformation("Keep-alive service stopping"); _timer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } public void Dispose() => _timer?.Dispose(); }Startup.cs的ConfigureServices中注册服务:services.AddHostedService<KeepAliveService>(); - 若保留外部自调用,改用服务器内网IP/域名发起请求,确保请求完整经过IIS管道
5. 补全IIS自动启动配置
- 确认已完成所有必要配置:
- 应用池高级设置→启动模式设为AlwaysRunning
- 网站高级设置→预加载已启用设为True
- 给应用池运行账户分配Log on as a service权限(本地安全策略→本地策略→用户权限分配)
- 若为
OutOfProcess模式,添加注册表配置自动重启进程:
打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options,新建项dotnet.exe,在该项下新建字符串值ShutdownFlags,值设为1
6. 检查服务器状态与更新
- 监控服务器CPU、内存、磁盘空间:资源不足会导致IIS强制回收应用池
- 安装Windows Server 2019与IIS的最新更新,修复已知的进程回收或ASP.NET Core模块bug
内容的提问来源于stack exchange,提问作者Rex
相关产品推荐
相关产品推荐

