Blazor 中的缓存破坏

Cache Busting in blazor

Blazor 中的缓存破坏有什么解决方案吗?我在 Blazor WebAssembly 中转换了我的 asp.net 核心应用程序,我在 razor 页面中使用 asp-append-version=true 进行客户端缓存更新。

Found DLL 存在同样的问题

根据@Mister评论添加我的答案。

BlazorPWA.MSBuild nuget包是生成PWA需要的文件。

对于更新缓存,您每次要发布代码时都会更改您的项目文件。

<ServiceWorkerCacheVersion>1</ServiceWorkerCacheVersion>
<ServiceWorkerForce>true</ServiceWorkerForce>

如果你想实现这个 nuget 包,请勾选这个 like

我和我的同事Nurzhan Aitbayev, Yerassyl Shalabayev制定了以下解决方案:

  1. 在 web.client 的 wwwroot/appsettings 中存储版本。json
"ApplicationSettings": {
    ...
    "Version": "Release-0"
  }
  1. 将版本存储在 web.server appsettings.json
"ApplicationSettings": {
    ...
    "Version": "Release-0"
  }
  1. Web 服务器总是 returns header 中的实际版本:
app.Use(async (context, next) =>
            {
                context.Response.Headers.Add("Application-Version", Configuration["ApplicationSettings:Version"]);
                await next.Invoke();
            });
  1. 客户端每次响应检查版本
private void CheckAppVersion(HttpResponseMessage response)
        {
            if (response == null)
            {
                throw new ArgumentNullException(nameof(response));
            }

            response.Headers.TryGetValues("Application-Version", out var headers);
            if (headers == null || !headers.Any())
            {
                return;
            }

            var appVersion = headers.First();
            if (!string.IsNullOrWhiteSpace(appVersion))
            {
                var localVersion = _applicationSettings.Version;
                var isActual = string.Compare(localVersion, appVersion, StringComparison.OrdinalIgnoreCase);

                if (isActual != 0)
                {
                    throw new OldVersionException("Версия приложения обновилась");
                }
            }
        }
  1. 如果用户遇到异常,则重新加载页面: C#
protected async Task RefreshPageAsync()
        {
            await JSRuntime.InvokeVoidAsync("reloadPage");
        }

JS

<script>
        function reloadPage() {
            location.reload(true);
        }
    </script>