如何通过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'
四、关键配置:确保路由与中间件兼容
- Web API路由配置:确保API控制器的路由前缀是
api,比如:
[Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { // 接口逻辑 }
或者在Program.cs全局设置:
app.MapControllers().WithRoutePrefix("api");
- 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
相关产品推荐
相关产品推荐

