IIS环境下Blazor Webassembly配置Brotli与Gzip压缩失效求助
Blazor WebAssembly v5 IIS部署压缩失效分步解决方案
前置检查
- 确认项目发布时已生成预压缩文件:检查发布输出的
wwwroot目录下是否存在.br、.gz后缀的对应资源文件(如dotnet.wasm.br、System.Text.Json.dll.gz等)- 若未生成,在项目
.csproj文件的PropertyGroup节点中添加配置:
重新发布后确认压缩文件存在。<BlazorEnableCompression>true</BlazorEnableCompression>
- 若未生成,在项目
- 确认IIS权限配置:给
IIS_IUSRS用户组授予以下目录的读写权限:- 站点根目录
- 压缩缓存目录
%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files
模块优先级调整
打开IIS管理器,进入对应站点的「模块」功能,点击右上角「查看有序列表」,将Rewrite模块移动到StaticCompressionModule、DynamicCompressionModule之前,确保重写规则先于压缩模块执行。
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" /> <mimeMap fileExtension=".js.gz" mimeType="application/javascript" /> <mimeMap fileExtension=".dat.gz" mimeType="application/octet-stream" /> <mimeMap fileExtension=".dll.gz" mimeType="application/octet-stream" /> <mimeMap fileExtension=".json.gz" mimeType="application/json" /> <mimeMap fileExtension=".wasm.gz" mimeType="application/wasm" /> <mimeMap fileExtension=".blat.gz" mimeType="application/octet-stream" /> <mimeMap fileExtension=".html.gz" mimeType="text/html" /> <mimeMap fileExtension=".css.gz" mimeType="text/css" /> <mimeMap fileExtension=".ico.gz" mimeType="image/x-icon" /> <mimeMap fileExtension=".svg.gz" mimeType="image/svg+xml" /> <mimeMap fileExtension=".js.br" mimeType="application/javascript" /> <mimeMap fileExtension=".dat.br" mimeType="application/octet-stream" /> <mimeMap fileExtension=".dll.br" mimeType="application/octet-stream" /> <mimeMap fileExtension=".json.br" mimeType="application/json" /> <mimeMap fileExtension=".wasm.br" mimeType="application/wasm" /> <mimeMap fileExtension=".blat.br" mimeType="application/octet-stream" /> <mimeMap fileExtension=".html.br" mimeType="text/html" /> <mimeMap fileExtension=".css.br" mimeType="text/css" /> <mimeMap fileExtension=".ico.br" mimeType="image/x-icon" /> <mimeMap fileExtension=".svg.br" mimeType="image/svg+xml" /> </staticContent> <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" staticCompressionIgnoreHitFrequency="true"> <scheme name="br" dll="%ProgramFiles%\IIS\IIS Compression\iisbrotli.dll" /> <scheme name="gzip" dll="%ProgramFiles%\IIS\IIS Compression\iiszlib.dll" /> <dynamicTypes> <remove mimeType="*/*" /> <add mimeType="application/octet-stream" enabled="true" /> <add mimeType="application/json" enabled="true" /> <add mimeType="application/wasm" enabled="true" /> <add mimeType="application/font-woff" enabled="true" /> </dynamicTypes> <staticTypes> <remove mimeType="*/*" /> <add mimeType="application/octet-stream" enabled="true" /> <add mimeType="application/json" enabled="true" /> <add mimeType="application/wasm" enabled="true" /> <add mimeType="application/font-woff" enabled="true" /> </staticTypes> </httpCompression> <rewrite> <outboundRules rewriteBeforeCache="true"> <rule name="Add Vary Accept-Encoding" preCondition="PreCompressedFile" enabled="true"> <match serverVariable="RESPONSE_Vary" pattern=".*" /> <action type="Rewrite" value="Accept-Encoding" /> </rule> <rule name="Add Encoding Brotli" preCondition="PreCompressedBrotli" enabled="true" stopProcessing="true"> <match serverVariable="RESPONSE_Content_Encoding" pattern=".*" /> <action type="Rewrite" value="br" /> </rule> <rule name="Add Encoding Gzip" preCondition="PreCompressedGzip" enabled="true" stopProcessing="true"> <match serverVariable="RESPONSE_Content_Encoding" pattern=".*" /> <action type="Rewrite" value="gzip" /> </rule> <preConditions> <preCondition name="PreCompressedFile"> <add input="{HTTP_URL}" pattern="\.(gz|br)$" /> </preCondition> <preCondition name="PreCompressedBrotli"> <add input="{HTTP_URL}" pattern="\.br$" /> </preCondition> <preCondition name="PreCompressedGzip"> <add input="{HTTP_URL}" pattern="\.gz$" /> </preCondition> </preConditions> </outboundRules> <rules> <!-- 压缩规则放在路径重写之前 --> <rule name="Rewrite brotli file" stopProcessing="true"> <match url="(.*)"/> <conditions> <add input="{HTTP_ACCEPT_ENCODING}" pattern="br" /> <add input="{REQUEST_FILENAME}" pattern="\.(js|dat|dll|json|wasm|blat|htm|html|css|ico|svg)$" /> <add input="{REQUEST_FILENAME}.br" matchType="IsFile" /> </conditions> <action type="Rewrite" url="{R:1}.br" /> </rule> <rule name="Rewrite gzip file" stopProcessing="true"> <match url="(.*)"/> <conditions> <add input="{HTTP_ACCEPT_ENCODING}" pattern="gzip" /> <add input="{REQUEST_FILENAME}" pattern="\.(js|dat|dll|json|wasm|blat|htm|html|css|ico|svg)$" /> <add input="{REQUEST_FILENAME}.gz" matchType="IsFile" /> </conditions> <action type="Rewrite" url="{R:1}.gz" /> </rule> <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后重启IIS站点
- 清空浏览器缓存后重新访问站点,打开开发者工具的网络面板,确认资源响应头中存在
Content-Encoding: br或Content-Encoding: gzip,资源加载耗时会下降到3秒以内。
内容的提问来源于stack exchange,提问作者nAviD
相关产品推荐
相关产品推荐

