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

.NET Core服务(IIS托管)关闭缓慢问题排查与解决求助

IIS托管.NET Core/6/7/8应用池停止后进程残留问题的原因与解决方案

这是IIS托管.NET Core系列应用时的常见问题,以下是具体原因分析和可落地的解决办法:

原因分析

  • 优雅关闭超时机制:ASP.NET Core 默认会等待90秒,让正在处理的请求、后台任务完成后再终止进程。如果存在未完成的长连接请求(如WebSocket)、未取消的异步操作,进程会持续存活直至超时。
  • 未响应终止信号的后台组件:应用中若有未注册CancellationToken的后台线程、长运行任务,或是未监听HostApplicationLifetime关闭事件的服务,这些组件会阻止进程正常退出。
  • IIS应用池配置宽松:默认的应用池终止策略偏保守,没有强制回收残留进程的机制,导致信号传递后进程仍未及时终止。

解决方案

1. 缩短优雅关闭超时时间

修改Program.cs,调整主机关闭超时,让进程更快响应终止信号:

var builder = WebApplication.CreateBuilder(args);

// 配置Kestrel关闭超时
builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.ShutdownTimeout = TimeSpan.FromSeconds(10);
});

// 配置通用主机关闭超时
builder.Host.ConfigureHostOptions(options =>
{
    options.ShutdownTimeout = TimeSpan.FromSeconds(10);
});

var app = builder.Build();

app.MapGet("/Ping", () => "OK");

app.Run();

2. 确保后台任务响应终止信号

如果应用包含长运行后台服务,必须通过CancellationToken监听关闭指令:

public class LongRunningService : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            // 后台任务逻辑
            await Task.Delay(1000, stoppingToken);
        }
    }
}

在Program.cs中注册该服务:

builder.Services.AddHostedService<LongRunningService>();

3. 调整IIS应用池强制终止配置

  1. 打开IIS管理器,找到目标应用池,右键选择高级设置
  2. 在进程模型下:
    • 设置关闭时间限制为10秒以内
    • 启用快速失败保护,合理设置快速失败保护间隔和失败次数
  3. 在回收选项中,启用禁用重叠回收(无需零停机部署时),确保旧进程立即终止

4. 临时强制清理残留进程

若需立即重启应用,可通过命令行强制杀死对应dotnet.exe进程:

# 根据窗口标题筛选进程并强制杀死
taskkill /F /IM dotnet.exe /FI "WINDOWTITLE eq SampleService"

# 或通过进程ID精准杀死
taskkill /F /PID <目标进程ID>

5. 排查第三方依赖

部分第三方库(如日志组件、数据库连接池)可能持有资源或后台线程导致进程无法退出,可尝试:

  • 更新依赖库到最新稳定版本
  • 检查库文档,确认是否需要手动处理应用关闭事件

内容的提问来源于stack exchange,提问作者rahul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:22:33