通过Azure DevOps部署ASP.NET Core 6 Web API至Azure Portal遇404错误
问题描述
使用Azure DevOps将ASP.NET Core 6 Web API项目部署到Azure Portal后,部署流程显示成功,但访问Swagger地址https://projectms.azurewebsites.net/swagger/index.html时出现HTTP 404错误。
已执行操作:
- 本地开发环境中.NET 6 API运行正常
- 在Azure DevOps配置了构建、打包、发布至Azure Portal的流水线
- 部署过程无报错,显示成功
已完成检查:确认代码路由配置正确、项目文件夹结构无问题,Azure DevOps部署日志未发现异常线索
预期结果:部署成功后可通过Swagger地址访问API并获取端点响应
相关配置
流水线YAML
steps: - task: UseDotNet@2 displayName: 'Use .NET Core sdk 6.x' inputs: version: 6.x - task: DotNetCoreCLI@2 displayName: Restore inputs: command: restore projects: '$(Parameters.RestoreBuildProjects)' vstsFeed: '3952c5b3-4b63-4724-9a4f-062de60190c8' - task: DotNetCoreCLI@2 displayName: Build inputs: projects: '$(Parameters.RestoreBuildProjects)' arguments: '--configuration $(BuildConfiguration)' - task: DotNetCoreCLI@2 displayName: Publish inputs: command: publish publishWebProjects: false projects: '**/*.csproj' arguments: '--configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)' zipAfterPublish: True - task: pekspro.pekspro-efcore-migration-script-generator.efcore-migration-script-generator.efcore-migration-script-generator-task@1 displayName: 'Generate Migration Scripts' inputs: projectpath: ProjectMS/ProjectMS.csproj databasecontexts: Context startupprojectpath: ProjectMS/ProjectMS.csproj installdependencies: true - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact' inputs: PathtoPublish: '$(build.artifactstagingdirectory)' condition: succeededOrFailed()
发布YAML - Azure App Service Deploy
steps: - task: AzureRmWebAppDeployment@4 displayName: 'Azure App Service Deploy: ProjectMS' inputs: azureSubscription: 'Suscripción de Azure 1 (97f0131b-0b4b-45a5-816a-52e41cf4c041)' WebAppName: ProjectMS packageForLinux: '$(System.DefaultWorkingDirectory)/_ProGest-ASP.NET Core-CI/drop/ProjectMS.zip'
Azure SQL SqlTask
- task: SqlAzureDacpacDeployment@1 displayName: 'Azure SQL SqlTask' inputs: azureSubscription: 'Suscripción de Azure 1 (97f0131b-0b4b-45a5-816a-52e41cf4c041)' ServerName: progest.database.windows.net DatabaseName: ProjectDB SqlUsername: CloudSA52ffd28c SqlPassword: Progest.Admin2023... deployType: SqlTask SqlFile: '$(System.DefaultWorkingDirectory)/_ProGest-ASP.NET Core-CI/drop/migrations/Context.sql'
排查建议与解决方案
1. 检查Swagger环境启用配置
ASP.NET Core 6 默认仅在开发环境中启用Swagger。打开项目Program.cs,确认Swagger服务和中间件的启用逻辑:
- 如果代码用
if (app.Environment.IsDevelopment())包裹Swagger配置,生产环境会自动关闭Swagger,导致404; - 若需在生产环境暴露Swagger,移除环境判断,或修改条件为
if (app.Environment.IsDevelopment() || app.Environment.IsProduction())。
示例正确配置:
var builder = WebApplication.CreateBuilder(args); // 添加Swagger服务 builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "ProjectMS API", Version = "v1" }); }); var app = builder.Build(); // 启用Swagger(不受环境限制) app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "ProjectMS API V1"); }); // 其他中间件(顺序不能错) app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
2. 验证Azure App Service环境变量
登录Azure Portal,进入目标App Service:
- 左侧菜单选择配置 > 应用程序设置
- 查看
ASPNETCORE_ENVIRONMENT的值:- 如果为
Production,且Swagger仅在Development启用,会导致404; - 可临时改为
Development测试,或修改代码适配生产环境。
- 如果为
3. 检查发布包内容
从Azure DevOps下载发布的ProjectMS.zip包,解压后验证:
- 确认
wwwroot/swagger目录存在,且包含v1/swagger.json等文件; - 检查
web.config(Windows环境)或启动命令配置(Linux环境)是否正确。
4. 核对Linux App Service启动命令
若使用Linux计划的App Service:
- 进入配置 > 常规设置
- 确认启动命令为
dotnet ProjectMS.dll,错误的启动命令会导致应用无法正常加载。
5. 查看App Service运行日志
- 进入App Service > 日志流,实时查看应用启动和运行日志;
- 开启应用日志记录,下载日志文件排查是否有启动异常、路由冲突等问题;
- 尝试访问API基础路径
https://projectms.azurewebsites.net/,确认API是否正常启动(而非仅Swagger问题)。
6. 检查流水线发布参数
- 确认
DotNetCoreCLI@2的Publish任务中,$(BuildConfiguration)变量值:如果是Release,需确保代码在Release环境下Swagger已启用; - 核对
projects: '**/*.csproj'是否正确指向目标API项目,避免发布无关项目。
7. 确认中间件顺序
Program.cs中中间件顺序必须符合规范:
UseSwagger()和UseSwaggerUI()必须在UseAuthorization()和MapControllers()之前;- 避免自定义路由覆盖Swagger的默认路由。
内容的提问来源于stack exchange,提问作者Progest
相关产品推荐
相关产品推荐

