Ошибка целостности развертывания 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 проверки целостности