You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免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自动启动配置

  • 确认已完成所有必要配置:
    1. 应用池高级设置→启动模式设为AlwaysRunning
    2. 网站高级设置→预加载已启用设为True
    3. 给应用池运行账户分配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:46:04