【问题标题】:Blazor Wasm PWA IIS Deployment integrity errorBlazor Wasm PWA IIS 部署完整性错误
【发布时间】:2020-11-14 13:08:11
【问题描述】:

我创建了一个新的 Blazor PWA WebAssembly(最新版本默认模板)项目并将其部署在 Windows Server 中的 IIS 中以尝试 PWA。

安装了最后一个 .NET Core 托管包。

发布后,我运行Microsoft Docs中的脚本重命名dll文件:

dir .\_framework\_bin | rename-item -NewName { $_.name -replace ".dll\b",".bin" } ((Get-Content .\_framework\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content .\_framework\blazor.boot.json

还有 serviceworker 重命名代码:

((Get-Content .\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content .\service-worker-assets.js

然后我删除了文档说的压缩文件:

wwwroot\service-worker-assets.js.br
wwwroot\service-worker-assets.js.gz
wwwroot\_framework\blazor.boot.json.br
wwwroot\_framework\blazor.boot.json.gz

但我在加载应用程序时仍然收到错误:

我在这里错过了什么?

我猜这与哈希和重命名有关,但在 Blazor 的 Github 问题中找不到任何解决方案。

【问题讨论】:

标签: iis progressive-web-apps blazor-webassembly


【解决方案1】:

由于您对 blazor.boot.json 文件的修改,完整性检查失败。 service-worker-assets.js 包含文件列表及其在发布时计算的完整性哈希值。 您可以使用 Bash/PowerShell 手动重新计算哈希值,因为您使用的是 IIS,所以我将提供我用于类似问题的 PowerShell 脚本:

# make sure you're in the wwwroot folder of the published application
$JsFileContent = Get-Content -Path service-worker-assets.js -Raw
# remove JavaScript from contents so it can be interpreted as JSON
$Json = $JsFileContent.Replace("self.assetsManifest = ", "").Replace(";", "") | ConvertFrom-Json
# grab the assets JSON array
$Assets = $Json.assets
foreach ($Asset in $Assets) {
  $OldHash = $Asset.hash
  $Path = $Asset.url
  
  $Signature = Get-FileHash -Path $Path -Algorithm SHA256
  $SignatureBytes = [byte[]] -split ($Signature.Hash -replace '..', '0x$& ')
  $SignatureBase64 = [System.Convert]::ToBase64String($SignatureBytes)
  $NewHash = "sha256-$SignatureBase64"
  
  If ($OldHash -ne $NewHash) {
    Write-Host "Updating hash for $Path from $OldHash to $NewHash"
    # slashes are escaped in the js-file, but PowerShell unescapes them automatically,
    # we need to re-escape them
    $OldHash = $OldHash.Replace("/", "\/")
    $NewHash = $NewHash.Replace("/", "\/")
    $JsFileContent = $JsFileContent.Replace("""$OldHash""", """$NewHash""")
  }
}

Set-Content -Path service-worker-assets.js -Value $JsFileContent -NoNewline

此脚本遍历 service-worker-assets.js 中列出的所有文件,计算每个文件的新哈希值,如果不同,则更新 JavaScript 文件中的哈希值。 您必须使用已发布的 wwwroot 文件夹作为当前工作目录来执行脚本。

我在我的博客上对此进行了更详细的描述:Fix Blazor WebAssembly PWA integrity checks

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 2021-07-26
    • 2021-02-09
    • 2021-03-23
    • 2023-03-22
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多