Blazor Wasm PWA IIS部署完整性错误

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

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

已安装最后一个.NET Core托管捆绑包

发布后,我在中运行脚本以重命名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问题中找不到任何解决方案。

由于您对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 |…