.NET 9中无法生成静态资源及清单文件问题排查
解决.NET 9 + Razor Pages + Parcel项目发布时的静态资源问题
问题现象
基于.NET 9、Razor Pages和Parcel构建的Web项目,执行dotnet publish -c Release后出现两个异常:
publish/wwwroot目录缺少预期的.br和.gz压缩文件webapp.staticwebassets.endpoints.json文件无任何资源信息
解决方案
1. 启用静态资源压缩生成.br/.gz文件
.NET默认不会自动为wwwroot文件生成压缩包,需在项目配置中显式启用静态资产压缩,并确保Parcel构建的文件被纳入处理流程。
修改.csproj文件,在<PropertyGroup>中添加压缩相关配置:
<PropertyGroup> <TargetFramework>net9.0</TargetFramework> <!-- 启用静态资产压缩 --> <StaticWebAssetsEnableCompression>true</StaticWebAssetsEnableCompression> <!-- 指定需要生成的压缩格式 --> <StaticWebAssetsCompressionFormats>br;gz</StaticWebAssetsCompressionFormats> </PropertyGroup>
同时添加ItemGroup标记wwwroot下的所有文件为静态资源:
<ItemGroup> <Content Update="wwwroot/**/*"> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> <StaticWebAsset>true</StaticWebAsset> </Content> </ItemGroup>
2. 修复webapp.staticwebassets.endpoints.json为空的问题
该文件为空是因为.NET静态资源系统未扫描到wwwroot中的文件,需调整Parcel构建目标的执行时机,确保文件生成后被系统识别。
修改.csproj中的Publish目标,将BeforeTargets从BeforePublish改为ComputeFilesToPublish:
<Target Name="Publish" DependsOnTargets="Setup" BeforeTargets="ComputeFilesToPublish" Condition="'$(Configuration)' == 'Release'"> <Exec Command="npm run publish" WorkingDirectory="$(ProjectDir)" /> </Target>
另外,清理Program.cs中重复的静态资源映射代码——.NET 9中MapRazorPages().WithStaticAssets()已包含静态资源映射逻辑,多余调用可能导致冲突:
// 移除该行重复代码 // application.MapStaticAssets(); application.MapRazorPages().WithStaticAssets();
3. 验证Parcel构建逻辑
确认Parcel脚本仅在构建前清理wwwroot,避免影响后续.NET处理流程(当前脚本逻辑已符合要求,可直接保留):
"scripts": { "publish": "rimraf ./wwwroot && parcel build ./approot/index.js --dist-dir ./wwwroot --no-cache --no-source-maps" }
完成上述配置后,重新执行dotnet publish -c Release,即可验证publish/wwwroot目录是否生成.br/.gz文件,以及webapp.staticwebassets.endpoints.json是否包含资源条目。
内容的提问来源于stack exchange,提问作者Miguel Moura
相关产品推荐
相关产品推荐

