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

Azure App Service优雅停机超时时间延长问题

Azure App Service .NET 6 Windows 环境优雅停机超时问题解决

问题场景

在Azure App Service(.NET 6.0、Windows 64位、托管管道版本为"Integrated")中,通过IHostApplicationLifetime.ApplicationStopping.Register()注册停机回调,测试慢停机时添加了300秒的循环等待逻辑:

for (int i = 0; i < 300; i++) // 等待5分钟
{
    Thread.Sleep(TimeSpan.FromSeconds(1));
    Console.WriteLine($"已等待 {(i + 1)} 秒.");
}

点击Azure门户的停止按钮后,回调虽被触发,但进程会在约30秒后被强制终止,无法输出完整的300秒日志。

已尝试的无效方案

  • 在Program.Main中配置应用内停机超时:
    WebHost.CreateDefaultBuilder(args)
        .UseShutdownTimeout(TimeSpan.FromMinutes(10)) // 设置足够的优雅停机时间
        .UseStartup<Startup>();
    
  • 在web.config中设置ASP.NET Core停机超时:
    <aspNetCore shutdownTimeLimit="600" processPath=".\MyService.exe" hostingModel="inprocess" />
    

解决办法

问题核心在于Azure App Service Windows环境层面有一个默认30秒的停机超时限制,会覆盖应用内的配置,需补充以下配置:

  1. 添加Azure应用设置(环境变量)
    在Azure门户的App Service -> 配置 -> 应用设置中,新增键为WEBSITE_SHUTDOWN_TIMEOUT的设置,值设为600(单位:秒,需大于你的测试时长300秒)。这个配置控制Azure层面给应用的停机缓冲时间,超时后会强制终止进程。

  2. 确认应用内配置有效性
    若使用.NET 6顶级语句模式,确保停机超时配置正确:

    var builder = WebApplication.CreateBuilder(args);
    builder.WebHost.UseShutdownTimeout(TimeSpan.FromMinutes(10));
    // 其他应用配置逻辑...
    

    同时保留web.config中的shutdownTimeLimit="600"配置,确保IIS向.NET进程传递的停机超时足够。

  3. 验证回调执行逻辑
    确保ApplicationStopping注册的回调为同步执行(当前代码已满足),若需异步操作,需在回调内等待异步任务完全完成,避免进程提前退出。

原理说明

Azure App Service Windows环境触发停止操作时,流程为:Azure发送停机信号给IIS → IIS通知.NET进程启动优雅停机:

  • WEBSITE_SHUTDOWN_TIMEOUT:控制Azure等待应用终止的总时长
  • shutdownTimeLimit:控制IIS等待.NET进程终止的时长
  • .UseShutdownTimeout():控制.NET应用内部处理停机逻辑的超时上限
    三者需保持一致且大于你的停机处理时长,才能确保回调逻辑完整执行。

内容的提问来源于stack exchange,提问作者Mo B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:30:48