Azure DevOps流水线部署Asp.net Core MVC应用遇Service Unavailable错误
1. 启用部署槽预热机制
- 登录Azure门户,进入目标App Service的「部署槽」页面,选中你的部署槽后打开「配置」->「常规设置」
- 勾选「预热实例」选项,让Azure在部署完成后等待应用完成初始化再对外提供服务,避免未就绪实例返回503错误
- 若用流水线/ARM模板配置,可在App Service的
siteConfig中添加alwaysOn: true和preWarmedInstanceCount: 1(根据实例数量调整参数值)
2. 优化流水线部署后的等待逻辑
- 若使用Azure Web App Deploy任务,在「高级」设置里勾选「部署后等待站点启动」选项,让流水线等待应用启动完成再结束
- 或在部署步骤后添加PowerShell/Azure CLI步骤,循环检查槽实例状态和应用健康端点:
# 等待槽实例进入运行状态 while true; do STATE=$(az webapp show --name <你的应用名> --resource-group <资源组名> --slot <部署槽名> --query state -o tsv) if [ "$STATE" = "Running" ]; then break fi sleep 10 done # 检查应用健康端点(需提前在项目中配置/health这类健康检查接口) while true; do RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" https://<你的部署槽域名>/health) if [ "$RESPONSE" = "200" ]; then break fi sleep 10 done
3. 修正启停步骤的目标与时机
- 确保启停操作针对部署槽而非生产槽,Azure CLI命令需添加
--slot <部署槽名>参数 - 将启停步骤放在部署完成后,且启动后预留足够初始化时间:
# 停止部署槽 az webapp stop --name <你的应用名> --resource-group <资源组名> --slot <部署槽名> # 启动部署槽 az webapp start --name <你的应用名> --resource-group <资源组名> --slot <部署槽名> # 等待应用初始化 sleep 60
4. 排查ASP.NET Core应用启动问题
- 启用App Service的「Always On」选项(配置->常规设置),防止实例被Azure自动休眠
- 查看Azure门户的「日志流」,检查部署后的启动报错(比如依赖缺失、数据库连接失败等),这类问题会导致启动失败,手动重启才会触发重新初始化
- 在
Program.cs中添加启动日志,便于定位初始化阶段问题:
var builder = WebApplication.CreateBuilder(args); builder.Logging.AddAzureWebAppDiagnostics(); // 其他配置代码... var app = builder.Build(); app.Logger.LogInformation("应用启动完成,开始监听请求");
5. 检查部署槽交换设置(若涉及生产槽交换)
- 若部署后需交换到生产槽,确保交换时启用「交换前预热」选项,让Azure先预热目标槽实例,避免交换后生产槽出现503
- 在流水线的Swap Slots任务中,勾选「Pre-warm swap target slot instances」选项
内容的提问来源于stack exchange,提问作者Fahad Mughal
相关产品推荐
相关产品推荐

