在 ASP.NET Core 3.1 和 Blazor WebAssembly 3.2 中,静态 Web 资产的冲突验证出现问题。 问题:
- 阻碍了主机资产和 Razor 类库 (RCL) 及 Blazor WebAssembly 应用中资产之间的正常冲突检测。
- RCL 中的静态 Web 资产默认在
_content/$(PackageId)前缀下提供,因此主要影响 Blazor WebAssembly 应用。
已引入的版本
5.0
旧行为
在开发过程中,RCL 的静态网页资源可能会在没有通知的情况下被同一路径上的主机项目资源覆盖。 假设 RCL 定义了一个静态 Web 资产,该资产可在 /folder/file.txt提供服务。 如果主机将文件放置在 wwwroot/folder/file.txt,则服务器上的文件以无提示方式覆盖 RCL 或 Blazor WebAssembly 应用上的文件。
新行为
ASP.NET Core 正确检测到此问题何时发生。 它会通知您作为用户有关冲突的信息,以便您可以采取适当的行动。
更改原因
静态 Web 资产不应被项目的 wwwroot 主机上的文件替代。 允许重写这些文件可能会导致难以诊断的错误。 结果可能是已发布应用中未定义的行为更改。
建议的措施
默认情况下,RCL 文件没有理由与主机上的文件冲突。 RCL 文件的前缀是 _content/${PackageId}。 Blazor WebAssembly 文件放置在主机 URL 命名空间的根目录,这更容易导致冲突。 例如,Blazor WebAssembly 应用程序包含一个favicon.ico文件,而主机可能也在其 wwwroot 文件夹中包含该文件。
如果冲突的源是 RCL 文件,则通常意味着代码将资产从库复制到项目的 wwwroot 文件夹中。 编写用于复制文件的代码会破坏静态 Web 资产的主要目标。 内容更新时无需触发新的编译即可在浏览器中实时获取更新,这一目标至关重要。
可以选择保留此行为并维护主机上的文件。 为此,请使用自定义 MSBuild 目标从静态 Web 资产列表中删除该文件。
若要使用 RCL 的文件或 Blazor WebAssembly 应用的文件而不是主机项目的文件,请从主机项目中删除该文件。
受影响的 API
没有