Blazor中的缓存清除

5
在Blazor中是否有缓存破坏的解决方案?我将我的asp.net core应用程序转换为Blazor WebAssembly,在razor页面中使用asp-append-version=true来更新客户端缓存。 发现DLL存在同样的问题。

4
使用服务工作者缓存文件,并在需要客户端更新时更新缓存版本。 <plug>BlazorPWA.MSBuild</plug> 是一个免费的开源包,可在nuget上获取,它会为您完成所有设置。 - Mister Magoo
2个回答

5

我和我的同事Nurzhan AitbayevYerassyl Shalabayev开发了以下解决方案:

  1. 将版本存储在Web客户端的wwwroot/appsettings.json中。
"ApplicationSettings": {
    ...
    "Version": "Release-0"
  }

在web.server的appsettings.json中存储版本号。
"ApplicationSettings": {
    ...
    "Version": "Release-0"
  }
  1. Web服务器始终在头部返回实际版本:
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>

2
根据@Mister Comment的回答,我来补充一下。 BlazorPWA.MSBuild nuget包是用于生成PWA所需文件的。
对于更新缓存,每次发布代码时都需要更改您的项目文件。
<ServiceWorkerCacheVersion>1</ServiceWorkerCacheVersion>
<ServiceWorkerForce>true</ServiceWorkerForce>

如果您想要实现这个 NuGet 包,请查看 此链接


目前该软件包已被弃用。至少在NuGet上是这样的。 - Nurzhan Aitbayev
1
这个问题的所有解决方案似乎都依赖于这个 NuGet 包,但是该包已经被弃用了。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接