在 Blazor 应用程序中,无法找到资源的 'integrity' 属性中的有效摘要。

66
我有一个Blazor客户端/服务器应用程序,我已经在一段时间内进行了开发,并且一直运行良好。突然间,我开始遇到这个错误:
“在资源'https://mydomain.no/_framework/Faso.Blazor.SpinKit.dll'的'integrity'属性中找不到有效的摘要,计算得到的SHA-256摘要为'1UEuhA1KzEN0bQcoU0m1eL4WKcCIWHhPgoXydAJnO9w='。该资源已被阻止。”

Failed to find a valid digest in the 'integrity' attribute for resource

我已经尝试过清理和重建。我尝试了添加Cors、设置文件夹权限以及许多其他建议的解决方案,但都没有成功。我正在使用VS 2022和Win Server 2016进行Web部署,.net core 5.0。

4
我知道这不是一个合适的解决方案,但对我来说,在服务器的wwwroot\_framework目录中删除所有的.br和.gz文件解决了问题。因此,在我的情况下,问题必须与压缩版本的文件有关,而不是普通的dll文件。 - Paul
Paul提出了一个重要的观点 - 确保服务器上的所有文件都得到更新,并且没有被卡在缓存中。 - Michel Jansson
老实说,在开发环境中,请禁用完整性检查。这将大大加快整个过程的速度。 - eagle275
这次我通过删除.gr和.gz文件解决了问题。部署后,这个问题偶尔会发生。 - undefined
11个回答

118

这确实是一个令人烦恼的问题,我经常遇到这个错误。通常出现在更新某些包之后,生成过程无法获取包的新 SHA。

您可以通过查找包含 SHA 的文件,并将问题 dll 的 SHA 与错误消息中的 SHA 进行比较来验证此问题。

此文件名为 blazor.boot.json,位于项目文件夹的 obj 文件夹内部深处生成。(我的在此位置:obj\Release\net6.0\win-x86\PubTmp\Out\wwwroot\_framework

如果是这个问题,请尝试以下操作:

  1. 关闭 VS。
  2. 删除所有项目的 objbin 文件夹。(仅 Web 项目可能就足够了,但这样做没有坏处)
  3. 启动 VS。
  4. 重新生成解决方案。
  5. 再次尝试发布。

3
非常感谢。我尝试了所有的方法,但在重新部署后SHA值不匹配。我将服务器上的SHA值与错误信息进行了比较,它们也不匹配。 - Bjørn Hellesylt
2
谢谢你,Michel。我遇到了同样的问题,删除 obj 文件夹并重新构建、发布到服务器后,一切都正常了。 - Paul
3
这些步骤对我没有起作用。我清除了本地文件、临时文件、服务器文件,但是 .net 6/vs2022 最新的全新 Blazor wasm 应用程序由于不同的 shas 而失败。 - inliner49er
1
谢谢,这很有帮助,但我不得不删除整个解决方案,而不仅仅是bin和obj文件夹。 - Davorin Puhar
3
除了这些步骤外,您可能需要清除浏览器缓存,关于@user3529134的内容。 - Kwame
显示剩余10条评论

22

这里的所有答案都很好。

我的解决方案唯一的注意点是我使用的是托管的 Blazor WASM 模型。由于我们发布了服务器应用程序,它有权为我们构建客户端。在看到每个解决方案都说要删除您的 binobj 文件夹后,我在办公室的每堵墙上撞了头,直到最终意识到我不需要删除“Server”项目中的 binobj,而是可能需要去客户端项目那里进行操作。

事后看来这可能很简单,但今早咖啡给了我当头棒喝。虽然这伤害了我的自尊心,但希望这可以成为某人的灵光一现。有时候你就是那些小事情。 :D


1
感谢您留下这个信息线索,否则我可能要花很长时间才能想到它。 - Neil Busse

5
我成功的方法是使用我的FTP客户端,并将传输类型从“自动”更改为“二进制”(传输>传输类型>二进制)。我在Visual Studio 2022中没有看到这样做的选项,所以我猜我现在会使用我的手动FTP客户端解决方案。

是的,这是一个非常好的解决方案,非常感谢。 - MuhammedBalta
这个问题和OP遇到的问题有什么关联吗?听起来像是一个XY解决方案。还有一些关键信息可能丢失了,比如在不同类型的操作系统之间传输文件(例如从Windows到Linux或者反之),这可能会成为一个问题。 - TylerH

4

请查看来自 https://learn.microsoft.com/en-us/aspnet/core/blazor/host-and-deploy/webassembly?view=aspnetcore-6.0 的说明:

解决完整性检查失败问题: 当Blazor WebAssembly下载应用程序的启动文件时,它会指示浏览器对响应执行完整性检查。 Blazor在blazor.boot.json文件中发送DLL(.dll)、WebAssembly(.wasm)和其他文件的SHA-256哈希值,该文件不会被客户端缓存。 缓存文件的文件哈希与blazor.boot.json文件中的哈希进行比较。 对于哈希匹配的缓存文件,Blazor将使用缓存文件。 否则,从服务器请求文件。下载文件后,将再次检查其哈希以进行完整性验证。 如果任何下载的文件的完整性检查失败,则浏览器会生成错误。

如果删除了 obj 和 bin 文件夹后错误仍然存在,请确保清除您的客户端浏览器网站缓存(Ctrl + F5)。


这似乎是对Michel Janson一年前回答的评论,而不是独立的解决方案。你提出了同样的建议,只是还加上了“如果需要,清除浏览器缓存”。实际上,在你回答之前一个月,有人在Michel的回答下评论了这个确切的解决方案:https://i.stack.imgur.com/jb6Z1.png - TylerH

3
我将我的Web API服务和Blazor Wasm项目放在同一台服务器上,使用不同的子域名。它们都使用.NET 6。虽然Web API运行良好,但Blazor项目却出现了错误。
然后我尝试将Blazor项目移动到另一台已经运行的Blazor Wasm服务器上,结果成功!
在Windows Server 2022上,使用IIS 10.0.20348.1和.NET Core Hosting Bundle 6.0.7时出现问题,但在Windows Server 2019上,使用IIS 10.0.17763.1和.NET Core Hosting Bundle 6.0.6时却能正常工作。

这听起来就像是你错误地配置了你的2022服务器。听起来并不像一个有帮助的解决方案,因为汇编文件或其完整性不应该从一个服务器到另一个服务器发生变化。 - TylerH
什么样的服务器配置错误会导致这个错误?我按照通常的方式安装了Windows Server和Plesk,并且Plesk正在配置IIS和.Net Core。 - Omer Faruk KAYA
据我记得,在后端方面,有一个错误我无法解决,只出现在PUT请求中。我在服务器上尝试了很多方法,但问题并未解决。将相同的文件移动到另一台服务器后,错误消失了。我知道有些地方出了问题,但问题的原因是什么呢? - Omer Faruk KAYA
这是一个很好的问题,而且在声称这是问题的解决方案中,你绝对不能不回答它。这些技术在Windows Server 2022上的IIS 10上运行得很好,所以问题肯定出在用户这边。 - TylerH

3
在大多数情况下,“Failed to find a valid digest in the 'integrity' attribute for resource......”警告并不表示完整性检查存在问题。相反,该警告通常意味着存在其他问题。
在我的情况下,当我将我的“Blazor自定义元素”部署到APACHE服务器上(以将其集成到PHP网站中)时,在FireFox上运行良好,但在Edge和Chrome上出现了此问题!我仍然没有找到原因。
将此属性添加到.csproj文件中将禁用完整性检查,并且它可以正常工作:
<BlazorCacheBootResources>false</BlazorCacheBootResources>

微软在这里提供了相当广泛和复杂的文档: https://learn.microsoft.com/en-us/aspnet/core/blazor/host-and-deploy/webassembly?view=aspnetcore-7.0&WT.mc_id=DT-MVP-5000641#disable-integrity-checking-for-non-pwa-apps


1
所以,你的回答是:1. 错误信息秘密地并不意味着它所说的意思,2. 你不知道为什么一开始就出现了这个错误(你明白我为什么觉得第一点难以置信吗?),以及 3. 直接绕过完整性检查而不修复根本原因(而你之前说你不知道是什么原因)。我不确定这样有多大帮助。也许只是在问题下面发表评论建议禁用完整性检查会更好...就像已经有人做过的那样... - TylerH

2

对我来说,问题出在 MIME 类型设置上。 有一个 web.config 文件更改了 Mime 类型,但我需要手动在 IIS 中更改我的 Blazor 页面的设置。 修改之后,它就正常工作了。 发布文件夹中的 Web.config 包含以下部分:

      <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" />

这与IIS中的Mime设置冲突了。

在我将IIS中的Mime设置更改为来自web.config中的值后,它就起作用了。


1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

2

对于我来说(我已将SDK从.NET 6更新到7),解决方案如下:

  • 清除所有bin和obj文件夹
  • 清除所有nuget缓存 说明
  • 运行应用程序并清除浏览器缓存(Ctrl+F5)

你有没有先尝试清除 NuGet 缓存呢?这似乎只是重复了顶部的答案,并添加了一个额外的步骤。 - TylerH

1

我手动在Github Pages上部署了我的Blazor应用程序Git更改了我的.js文件中的EoL字符,导致完整性检查失败。

使用此命令禁用部署存储库的autocrlf功能:

git config core.autocrlf false

然后从 publish/wwwroot 文件夹重新添加所有文件和文件夹。

我还确保了在 .gitattributes 文件中,特定文件被识别为“二进制”:

*.dll binary
*.gz binary
*.dat binary
*.blat binary
*.wasm binary
*.ico binary
*.eot binary
*.otf binary
*.ttf binary
*.woff binary

对于在Github Pages上部署的其他人,需要添加一个.nojekyll文件以允许访问以_(例如_framework)开头的文件夹。


0
在我的情况下,删除 .gz 和 .br 文件就足以解决问题了。也许不是最好的解决方案,但是它是可行的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接