Blazor Wasm PWA IIS部署完整性错误

时间:2020-07-24 16:11:24

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

我创建了一个新的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

服务人员也重命名代码:

((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

但是加载应用程序时仍然出现错误:

enter image description here

我在这里想念什么?

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

1 个答案:

答案 0 :(得分:0)

由于您修改了 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