Blazor Wasm PWA IIS部署完整性错误
我创建了一个新的Blazor PWA WebAssembly(最新版本默认模板)项目,并将其部署在Windows服务器中的IIS中以尝试PWA 已安装最后一个.NET Core托管捆绑包 发布后,我在中运行脚本以重命名dll文件:Blazor Wasm PWA IIS部署完整性错误,iis,progressive-web-apps,blazor-webassembly,Iis,Progressive Web Apps,Blazor Webassembly,我创建了一个新的Blazor PWA WebAssembly(最新版本默认模板)项目,并将其部署在Windows服务器中的IIS中以尝试PWA 已安装最后一个.NET Core托管捆绑包 发布后,我在中运行脚本以重命名dll文件: dir .\_framework\_bin | rename-item -NewName { $_.name -replace ".dll\b",".bin" } ((Get-Content .\_framework\blazo
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问题中找不到任何解决方案。由于您对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文件夹作为当前工作目录来执行脚本
我在我的博客上更详细地描述了这一点:由于您修改了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文件夹作为当前工作目录来执行脚本
我在我的博客上更详细地描述了这一点:您是否重新压缩了更新后的blazor.boot.json文件?@samwu否,我如何重新压缩它?您可以使用PowerShell或straight.NET代码重新压缩它们:web上可能有一些实用程序您也可以使用。不过,gzip和brotli文件不是必需的,在IIS中托管时也不会自动使用。您可以通过更新web.config来启用它们的使用:类似这样的内容:我最近遇到了相同的问题,对我有效的方法是简单地重命名
\u bin
下面的依赖文件夹中的language.dll。因此,基本上在第一个命令中,您必须添加-r
,然后它才能工作dir.\\u framework\\u bin-r |…
你有重新压缩更新后的blazor.boot.json文件吗?@samwu没有,我该如何重新压缩它?你可以使用PowerShell或straight.NET代码重新压缩它们:网上可能有一些实用程序你也可以使用。不过,gzip和brotli文件不是必需的,在IIS中托管时也不会自动使用。您可以通过更新web.config来启用它们的使用:类似这样的内容:我最近遇到了相同的问题,对我有效的方法是简单地重命名\u bin
下面的依赖文件夹中的language.dll。因此,基本上在第一个命令中,您必须添加-r
,然后它才能工作<代码>目录。\\u框架\\u bin-r |…