子域名下虚拟目录部署Blazor WebAssembly PWA异常求助
Blazor WebAssembly PWA在IIS虚拟目录无法运行的解决方案
问题背景
子域名下配置两个虚拟目录:ASP.NET Core应用运行正常,但Blazor WebAssembly PWA在虚拟目录中无法启动;将相同文件复制到子域名根目录则可正常运行。当前使用的web.config如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <staticContent> <remove fileExtension=".blat" /> <remove fileExtension=".dat" /> <remove fileExtension=".dll" /> <remove fileExtension=".json" /> <remove fileExtension=".wasm" /> <remove fileExtension=".woff" /> <remove fileExtension=".woff2" /> <mimeMap fileExtension=".blat" mimeType="application/octet-stream" /> <mimeMap fileExtension=".dll" mimeType="application/octet-stream" /> <mimeMap fileExtension=".dat" mimeType="application/octet-stream" /> <mimeMap fileExtension=".json" mimeType="application/json" /> <mimeMap fileExtension=".wasm" mimeType="application/wasm" /> <mimeMap fileExtension=".woff" mimeType="application/font-woff" /> <mimeMap fileExtension=".woff2" mimeType="application/font-woff" /> </staticContent> <httpCompression> <dynamicTypes> <add mimeType="application/octet-stream" enabled="true" /> <add mimeType="application/wasm" enabled="true" /> </dynamicTypes> </httpCompression> <rewrite> <rules> <rule name="Serve subdir"> <match url=".*" /> <action type="Rewrite" url="wwwroot\{R:0}" /> </rule> <rule name="SPA fallback routing" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> </conditions> <action type="Rewrite" url="wwwroot\" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
问题原因
web.config中的重写规则硬编码了wwwroot\路径,未适配虚拟目录上下文,导致资源请求路径错误。- Blazor WASM的
base href未设置为虚拟目录路径,应用无法正确加载静态资源和路由。
解决步骤
1. 修正web.config重写规则
移除硬编码的目录路径,调整为适配虚拟目录的SPA回退规则:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <staticContent> <remove fileExtension=".blat" /> <remove fileExtension=".dat" /> <remove fileExtension=".dll" /> <remove fileExtension=".json" /> <remove fileExtension=".wasm" /> <remove fileExtension=".woff" /> <remove fileExtension=".woff2" /> <mimeMap fileExtension=".blat" mimeType="application/octet-stream" /> <mimeMap fileExtension=".dll" mimeType="application/octet-stream" /> <mimeMap fileExtension=".dat" mimeType="application/octet-stream" /> <mimeMap fileExtension=".json" mimeType="application/json" /> <mimeMap fileExtension=".wasm" mimeType="application/wasm" /> <mimeMap fileExtension=".woff" mimeType="application/font-woff" /> <mimeMap fileExtension=".woff2" mimeType="application/font-woff" /> </staticContent> <httpCompression> <dynamicTypes> <add mimeType="application/octet-stream" enabled="true" /> <add mimeType="application/wasm" enabled="true" /> </dynamicTypes> </httpCompression> <rewrite> <rules> <rule name="SPA fallback routing" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="index.html" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
说明:删除Serve subdir规则,建议将虚拟目录物理路径直接指向Blazor WASM发布后的wwwroot文件夹;调整回退规则直接指向index.html,避免路径冲突。
2. 设置正确的Base Href
在PWA的wwwroot/index.html中,将<base href="/" />修改为虚拟目录路径(例如虚拟目录名为BlazorPWA):
<base href="/BlazorPWA/" />
或发布时通过命令行指定,确保构建路径正确:
dotnet publish -c Release /p:BasePath=/BlazorPWA/
3. 验证IIS配置
- 虚拟目录物理路径需指向Blazor WASM发布后的
wwwroot文件夹(或包含修正后web.config的发布根目录)。 - 应用程序池设置为
No Managed Code(Blazor WASM为静态文件应用,无需.NET托管环境)。
内容的提问来源于stack exchange,提问作者H.M.Mubashir
相关产品推荐
相关产品推荐

