Azure Pipeline构建多项目部署后仅能访问Blazor WASM无法访问API怎么办
问题描述
现有包含Web API项目与Blazor WebAssembly项目的解决方案,Azure Pipeline生成发布制品流程运行正常,但部署完成访问对应域名时,仅能打开Blazor WebAssembly站点,无法正常访问Web API接口。已自定义名为BackEndRelease的生成配置,在配置中取消勾选Blazor项目后重新部署,问题未改善。
当前使用的Azure Pipeline配置如下:
# ASP.NET Core (.NET Framework) # Build and test ASP.NET Core projects targeting the full .NET Framework. # Add steps that publish symbols, save build artifacts, and more. # trigger: # - master pool: vmImage: 'windows-2022' variables: solution: '**/*.sln' buildPlatform: 'Any CPU' buildConfiguration: 'BackEndRelease' steps: - task: UseDotNet@2 displayName: Use .NET 6.0 inputs: packageType: 'sdk' version: '6.0.x' - task: NuGetToolInstaller@1 - task: NuGetCommand@2 inputs: restoreSolution: '$(solution)' - task: VSBuild@1 inputs: solution: '$(solution)' msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' - task: VSTest@2 inputs: platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' - task: PublishBuildArtifacts@1
问题根因
部署异常由三个配置错误共同导致:
- Pipeline构建范围错误:当前配置直接匹配整个解决方案执行打包,即使你在
BackEndRelease配置里取消勾选Blazor项目,只要两个项目的生成输出路径存在重叠,Blazor的静态发布产物就会混入最终部署包,覆盖API项目的配置文件 - 构建参数冗余:当前msbuild参数中携带了本地IIS部署专用的
DesktopBuildPackageLocation、DeployIisAppPath配置,会导致生成的部署包默认适配本地IIS默认站点,和实际部署的站点路由规则不匹配 - 应用中间件顺序错误:如果API项目中引入了Blazor WASM的托管支持,一旦把Blazor的兜底路由放在API路由之前,所有未匹配到静态文件的请求(包括API接口请求)都会被重定向到Blazor的
index.html,接口自然无法访问
修复方案
按以下顺序调整配置即可解决问题:
- 收窄Pipeline构建范围
不要直接构建整个解决方案文件,将VSBuild任务的构建目标从$(solution)修改为你的Web API项目的csproj文件路径(例如src/xxx.WebApi/xxx.WebApi.csproj),从构建源头排除Blazor项目的产物。 - 修正构建参数
替换VSBuild任务中的msbuildArgs配置为以下内容,移除本地IIS专用的冗余参数:/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" - 修正API项目中间件顺序
打开API项目的Program.cs(.NET 6+)或Startup.cs,严格按照以下顺序注册中间件,确保API路由优先级高于Blazor路由和静态文件:// 基础中间件(异常处理、HTTPS跳转等) app.UseHttpsRedirection(); // 路由、鉴权中间件 app.UseRouting(); app.UseAuthorization(); // 首先映射API接口路由 app.MapControllers(); // 如果需要同站点部署Blazor WASM,再添加以下配置,不需要可以直接删除 app.UseBlazorFrameworkFiles(); app.UseStaticFiles(); // Blazor兜底路由必须放在最后 app.MapFallbackToFile("index.html"); - 验证部署包内容
重新运行Pipeline生成制品后,下载WebApp.zip解压校验:- 包根目录必须存在API项目的对应dll文件、
web.config配置文件 - 如果不需要同站点部署Blazor,包内不能出现
_framework文件夹、index.html等Blazor产物,如果存在说明构建范围配置错误,需要重新检查csproj路径是否正确
- 包根目录必须存在API项目的对应dll文件、
- 部署验证
重新部署后优先访问已知的GET接口(例如/api/health),确认接口返回正常响应后,再访问Blazor页面对应路由即可。
内容的提问来源于stack exchange,提问作者Ties Mulder
相关产品推荐
相关产品推荐

