Ошибка целостности развертывания Blazor Wasm PWA IIS

Я создал новый проект Blazor PWA WebAssembly (шаблон последней версии по умолчанию) и развернул его в IIS в Windows Server, чтобы попробовать 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

Но при загрузке приложения я все еще получаю сообщение об ошибке:

Что мне здесь не хватает?

Я предполагаю, что это связано с хешами и переименованием, но я не могу найти никакого решения в проблемах Github Blazor.

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 проверки целостности

Другие вопросы по тегам