ASP.NET Core 8.0应用无请求时被IIS关闭,FileSystemWatcher失效求助
解决ASP.NET Core 8.0应用在IIS中无请求时自动终止的问题
1. 配置IIS应用程序池为"始终运行"模式
- 打开IIS管理器,定位到目标应用对应的应用程序池
- 右键选择「高级设置」
- 将启动模式设置为
AlwaysRunning,同时确认**闲置超时(分钟)**保持为0 - 该设置会让IIS预加载应用进程,并在后台持续维持运行,不会因无HTTP请求就终止
2. 补充ASP.NET Core托管配置(配合IIS设置)
在项目根目录的web.config中添加以下配置,确保进程内托管模式与IIS的始终运行机制兼容:
<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess"> <environmentVariables> <environmentVariable name="ASPNETCORE_HOSTINGSTARTUPASSEMBLIES" value="Microsoft.AspNetCore.Server.IISIntegration" /> </environmentVariables> </aspNetCore>
- 核心是将
hostingModel设为inprocess,这是ASP.NET Core与IIS集成的推荐模式,能最大化利用IIS的进程管理能力
3. 用轻量后台服务维持进程活跃(替代Ping端点)
如果IIS配置仍不生效,可添加一个无需额外HTTP端点的后台服务,持续标记进程为活跃状态:
public class KeepAliveService : BackgroundService { private readonly ILogger<KeepAliveService> _logger; public KeepAliveService(ILogger<KeepAliveService> logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { // 等待应用完全启动 await Task.Delay(TimeSpan.FromSeconds(10), stoppingToken); while (!stoppingToken.IsCancellationRequested) { try { _logger.LogDebug("维持应用活跃状态,当前时间:{Time}", DateTime.UtcNow); // 定期执行空操作,避免进程被标记为闲置 await Task.Delay(TimeSpan.FromMinutes(5), stoppingToken); } catch (OperationCanceledException) { _logger.LogInformation("活跃维持服务停止"); break; } } } }
在Program.cs中注册该服务:
builder.Services.AddHostedService<KeepAliveService>();
- 这个服务仅占用极低资源,无需额外请求就能持续让IIS认为进程处于工作状态,符合KISS原则
4. 排查IIS快速失败保护机制
若应用频繁崩溃,IIS可能主动终止进程:
- 打开应用程序池高级设置,找到快速失败保护模块
- 调整「失败次数」和「时间间隔」,或临时禁用该功能用于排查
- 同时检查Windows事件查看器的应用日志,确认是否存在未捕获的异常导致进程终止
内容的提问来源于stack exchange,提问作者Alex Smart
相关产品推荐
相关产品推荐

