wasm/dotnet Github 页面上我的 Blazor 应用程序的完整性属性无效

wasm/dotnet Integrity attribute invalid for my Blazor app on Github pages

See the error on my website here

我在我的 jekyll 网站中嵌入了一个 blazor 应用程序。它在本地运行完美,但是当我在 github 页面上发布它时,出现此错误:

Failed to find a valid digest in the 'integrity' attribute for resource 'https://chrisevans9629.github.io/blazor/xt/_framework/wasm/dotnet.3.2.0-rc1.20222.2.js' with computed SHA-256 integrity 'yVt8FYsTQDifOGsifIkmEXwe+7ML0jZ1dMi2xluiDXQ='. The resource has been blocked.

这是我认为 blazor 在页面 运行 时生成的内容。这是我的页面启动 blazor 时的样子:

<script src="js/index.js"></script>
<app>Loading...</app>
Built with <3 using Blazor
<script src="_framework/blazor.webassembly.js"></script>

这是 github 页上的页面:


<script src="js/index.js"></script>

<app>Loading...</app>
<p>Built with &lt;3 using Blazor
<script src="_framework/blazor.webassembly.js"></script></p>        

<script type="text/javascript">var Module; window.__wasmmodulecallback__(); delete window.__wasmmodulecallback__;</script><script src="_framework/wasm/dotnet.3.2.0-rc1.20222.2.js" defer="" integrity="sha256-iZCHkFXJWYNxCUFwhj+4oqR4fkEJc5YGjfTTvdIuX84=" crossorigin="anonymous"></script></body>

为什么会发生此错误,我该如何解决?我考虑过创建一个脚本来删除完整性属性,但我认为这不是一个好的解决方案。

似乎在 ServiceWorkerAssetsManifest 中为所有文件生成的哈希与在客户端生成的哈希不匹配。看起来 ServiceWorkerAssetsManifest 在修改文件时不会再次生成哈希,特别是静态文件。

我找到了答案here

原因

因为我正在使用 git 中心页面来托管我的 blazor 应用程序,所以它正在使用 git 来推送代码。 Git 默认情况下会在提交代码时尝试规范化行尾,这会导致 blazor 应用程序的完整性因文件更改而失败。

解决方案

为了解决这个问题,我在我的 blazor 文件夹中添加了一个 .gitattributes 文件,内容为 * binary

这告诉 git 将所有文件视为二进制文件,因此不要规范化行尾。在我这样做之后,我不得不删除我的 blazor 应用程序中的 _framework 文件夹并重建它。执行此操作后,blazor 应用程序运行。

以防其他人遇到我今天遇到的问题..

我在本地的一个Blazor Wasm应用程序上也出现了这个错误,简单修改后,恢复更改后仍然出现。

我的解决方案是进行清理和重建。

今天遇到了同样的问题,在我的情况下,错误来自 css 文件。 问题是我有两个版本的应用程序部署到本地文件夹。

一开始我是用老版本的,关闭了再打开新版本。 似乎旧的 css 文件缓存在浏览器中导致出现错误。

修复只需按 CTRL + U 打开 index.html 文件,单击导致错误的 css 文件,然后按 F5 重新加载文件。这为我解决了错误。

就我而言,这是发布配置文件中的错误目标框架 - 我不应该 selected win-x64。 我不确定确切原因,但服务器会根据目标框架以某种方式干扰响应。只需 select browser-wasm 并重新部署;应该没问题。

只是想在这里写下我在试图弄清楚发生了什么时遇到的事情。

如果出于某种原因您从应用程序中删除了服务工作人员并且资源实际上缓存在公共 http 缓存中,则有可能一旦您重新启用服务工作人员就会收到此错误,因为service worker 将选择 http 缓存版本而不是服务器的版本。

我所做的是将 cache: "no-cache" 添加到请求的初始化中。

所以我的 onInstall 现在看起来像这样

async function onInstall(event) {
    console.info('Service worker: Install');

    // Fetch and cache all matching items from the assets manifest
    const assetsRequests = self.assetsManifest.assets
        .filter(asset => offlineAssetsInclude.some(pattern => pattern.test(asset.url)))
        .filter(asset => !offlineAssetsExclude.some(pattern => pattern.test(asset.url)))
        .map(asset => new Request(asset.url, { integrity: asset.hash, cache: "no-cache" }));
    
    // Also cache authentication configuration
    assetsRequests.push(new Request('_configuration/TestApp.Client'));

    await caches.open(cacheName).then(cache => cache.addAll(assetsRequests));
}

更好的解决方案!

打开service-worker.js

改变

.map(asset => new Request(asset.url, { integrity: asset.hash }));

至:

.map(asset => new Request(asset.url));

现在可以了!

我在这个问题上花了太多时间。清理和重建对我不起作用。

对我有用的是从客户端 (Blazor WASM) 项目中删除 bin 和 obj 文件夹。

环境

.Net 5 和 6

Visual Studio 2019 年和 2022 年

我遇到了同样的问题,none 这些解决方案对我有用,但它们让我走上了正确的道路。我正在将我的部署到我的本地计算机并使用 IIS 进行测试,我发现在我在 Visual Studio 2022 年创建的发布配置文件中,未选中“在目标位置删除其他文件”复选框,并且我检查并重新发布后,一切正常。我一定是删除了一个在以前的版本中发布的文件,它仍然存在,因为它没有被任何后续 builds/publishes 删除。但这为我解决了,它可能