我创建了一个新的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
但是加载应用程序时仍然出现错误:
我在这里想念什么?
我想这与哈希和重命名有关,但在Blazor的Github问题中找不到任何解决方案。
答案 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