Azure App Service优雅停机超时时间延长问题
问题场景
在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秒的停机超时限制,会覆盖应用内的配置,需补充以下配置:
添加Azure应用设置(环境变量)
在Azure门户的App Service -> 配置 -> 应用设置中,新增键为WEBSITE_SHUTDOWN_TIMEOUT的设置,值设为600(单位:秒,需大于你的测试时长300秒)。这个配置控制Azure层面给应用的停机缓冲时间,超时后会强制终止进程。确认应用内配置有效性
若使用.NET 6顶级语句模式,确保停机超时配置正确:var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseShutdownTimeout(TimeSpan.FromMinutes(10)); // 其他应用配置逻辑...同时保留
web.config中的shutdownTimeLimit="600"配置,确保IIS向.NET进程传递的停机超时足够。验证回调执行逻辑
确保ApplicationStopping注册的回调为同步执行(当前代码已满足),若需异步操作,需在回调内等待异步任务完全完成,避免进程提前退出。
原理说明
Azure App Service Windows环境触发停止操作时,流程为:Azure发送停机信号给IIS → IIS通知.NET进程启动优雅停机:
WEBSITE_SHUTDOWN_TIMEOUT:控制Azure等待应用终止的总时长shutdownTimeLimit:控制IIS等待.NET进程终止的时长.UseShutdownTimeout():控制.NET应用内部处理停机逻辑的超时上限
三者需保持一致且大于你的停机处理时长,才能确保回调逻辑完整执行。
内容的提问来源于stack exchange,提问作者Mo B.

