托管型Blazor WASM应用基路径本地正常但作为IIS子应用失效
需补充的配置如下:
1. 修正Program.cs中UsePathBase的执行顺序
UsePathBase必须是构建app对象后第一个执行的中间件,早于所有路由、静态文件、认证授权、接口映射相关的中间件,否则路由中间件无法识别/app前缀的路径,会直接返回404。
示例正确顺序:
var app = builder.Build(); // 必须放在第一行,所有其他中间件之前 app.UsePathBase("/app"); // 后续其他中间件按顺序配置 app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllers(); app.MapBlazorHub(); // 必须配置fallback规则,处理前端路由 app.MapFallbackToFile("index.html"); app.Run();
2. 安装IIS必备组件
- 安装你Blazor应用对应版本的ASP.NET Core托管捆绑包,安装完成后重启IIS,否则IIS无法处理ASP.NET Core的接口请求
- 安装IIS官方URL重写模块,用于解决SPA路由直接访问404的问题
- 确认子应用对应的应用池配置为:无托管代码、托管管道模式为集成模式
3. 配置IIS URL重写规则
在Blazor应用的发布根目录下添加web.config文件,添加以下配置,将所有非物理文件、非接口的请求重定向到index.html,交给Blazor前端路由处理:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <staticContent> <remove fileExtension=".blat" /> <mimeMap fileExtension=".blat" mimeType="application/octet-stream" /> <remove fileExtension=".dll" /> <mimeMap fileExtension=".dll" mimeType="application/octet-stream" /> <remove fileExtension=".json" /> <mimeMap fileExtension=".json" mimeType="application/json" /> <remove fileExtension=".wasm" /> <mimeMap fileExtension=".wasm" mimeType="application/wasm" /> <remove fileExtension=".woff" /> <mimeMap fileExtension=".woff" mimeType="font/woff" /> <remove fileExtension=".woff2" /> <mimeMap fileExtension=".woff2" mimeType="font/woff2" /> </staticContent> <rewrite> <rules> <rule name="Blazor SPA Routing" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <add input="{REQUEST_URI}" pattern="^/(app)/api/" negate="true" /> </conditions> <action type="Rewrite" url="/app/index.html" /> </rule> </rules> </rewrite> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\替换为你的Server项目名.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" /> </system.webServer> </configuration>
注意替换配置中的替换为你的Server项目名.dll为你实际发布的服务端程序集名称。
4. 校验API路由和请求路径
- 确保服务端控制器已配置正确的路由属性,比如
[Route("api/[controller]")] - 前端发起接口请求时,使用相对路径(比如
fetch('api/fetchdata')),不要使用不带/app前缀的绝对路径
内容的提问来源于stack exchange,提问作者Mike Kerchenski
相关产品推荐
相关产品推荐

