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

通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:07:33