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

如何通过Azure DevOps单流水线将同一解决方案下的两个.NET Core项目(Web与Web API)部署至单个Azure Web App并配置不同路径映射?

实现Azure DevOps单流水线部署两个.NET Core项目到同一Azure Web App并配置路径映射

我完全懂你现在的困境——单独部署Web和Web API项目没问题,但要把它们塞进同一条DevOps流水线、部署到同一个Azure Web App还得各自配置路径映射,确实踩了不少坑对吧?我来给你一套亲测有效的分步方案,帮你搞定这个需求。

一、先搞定本地项目结构与兼容性测试

首先得确保你的两个项目在同一个解决方案里,结构大概是这样:

MySolution/
├── MyWebApp/          # ASP.NET Core Web项目
│   ├── MyWebApp.csproj
│   └── wwwroot/
├── MyWebApi/          # ASP.NET Core Web API项目
│   ├── MyWebApi.csproj
│   └── Controllers/
└── MySolution.sln

本地测试很重要:先把Web API发布到Web项目的api子目录,配置Web项目的中间件确保请求能正确转发——比如访问/能打开Web页面,/api/xxx能拿到API响应。这一步能避免部署后才发现本地逻辑有问题。

二、Azure DevOps流水线构建阶段配置

接下来要在流水线里同时构建两个项目,生成对应路径的发布包。这里推荐用YAML流水线,灵活性更高。

YAML流水线构建步骤

# 还原整个解决方案的依赖
- task: DotNetCoreCLI@2
  displayName: '还原依赖包'
  inputs:
    command: 'restore'
    projects: '**/*.sln'
    feedsToUse: 'select'

# 分别构建Web和Web API项目
- task: DotNetCoreCLI@2
  displayName: '构建Web项目'
  inputs:
    command: 'build'
    projects: '**/MyWebApp.csproj'
    arguments: '--configuration Release --no-restore'

- task: DotNetCoreCLI@2
  displayName: '构建Web API项目'
  inputs:
    command: 'build'
    projects: '**/MyWebApi.csproj'
    arguments: '--configuration Release --no-restore'

# 发布到指定目录:Web到根目录,API到api子目录
- task: DotNetCoreCLI@2
  displayName: '发布Web项目'
  inputs:
    command: 'publish'
    projects: '**/MyWebApp.csproj'
    arguments: '--configuration Release --output $(Build.ArtifactStagingDirectory)/web --no-build'

- task: DotNetCoreCLI@2
  displayName: '发布Web API项目'
  inputs:
    command: 'publish'
    projects: '**/MyWebApi.csproj'
    arguments: '--configuration Release --output $(Build.ArtifactStagingDirectory)/api --no-build'

# 打包所有发布内容为流水线工件
- task: PublishBuildArtifacts@1
  displayName: '发布流水线工件'
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

如果习惯用经典可视化编辑器,步骤逻辑是一样的:添加还原、两次构建、两次发布(分别指定输出目录)、最后发布工件即可。

三、部署阶段:配置Azure Web App路径映射

这是最关键的一步,要把Web部署到根路径,API部署到/api虚拟应用。

1. 先在Azure Portal创建虚拟应用程序

登录Azure Portal,找到你的Web App:

  • 左侧菜单选择「配置」→「路径映射」
  • 在「虚拟应用程序和目录」区域点击「添加虚拟应用程序」
  • 配置:虚拟路径/api,物理路径site\wwwroot\api,一定要勾选「应用程序」选项(标记为独立应用,避免和Web项目冲突)
  • 保存配置

2. 流水线添加部署任务

在YAML里添加两个Azure App Service Deploy任务,分别部署Web和API到对应路径:

# 部署Web项目到根路径
- task: AzureRmWebAppDeployment@4
  displayName: '部署Web到根路径'
  inputs:
    azureSubscription: '你的Azure订阅连接'
    WebAppName: '你的Web App名称'
    packageForLinux: '$(Build.ArtifactStagingDirectory)/web'
    VirtualApplication: '/'
    enableCustomDeployment: true
    DeploymentType: 'webDeploy'

# 部署Web API到/api路径
- task: AzureRmWebAppDeployment@4
  displayName: '部署API到/api路径'
  inputs:
    azureSubscription: '你的Azure订阅连接'
    WebAppName: '你的Web App名称'
    packageForLinux: '$(Build.ArtifactStagingDirectory)/api'
    VirtualApplication: '/api'
    enableCustomDeployment: true
    DeploymentType: 'webDeploy'

四、关键配置:确保路由与中间件兼容

  1. Web API路由配置:确保API控制器的路由前缀是api,比如:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    // 接口逻辑
}

或者在Program.cs全局设置:

app.MapControllers().WithRoutePrefix("api");
  1. Web项目中间件:如果是Blazor或单页应用,要确保API请求不会被Web项目的Fallback中间件接管,比如:
// 先处理API请求
app.MapControllers();
// 再处理Web项目的Fallback
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

五、验证部署

部署完成后,测试访问:

  • 根路径https://yourwebapp.azurewebsites.net/:应该显示Web项目内容
  • API路径https://yourwebapp.azurewebsites.net/api/values:应该返回API正常响应

如果遇到404/500错误,可以检查:

  • Azure Portal的虚拟应用程序配置是否正确,物理路径是否匹配部署后的目录
  • Web App的.NET Core运行时版本是否和两个项目的版本一致(「配置」→「常规设置」→「堆栈设置」)
  • 查看Web App的「日志流」,排查具体报错信息

内容的提问来源于stack exchange,提问作者Sandeep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:02:34