首页 > 解决方案 > blazor 中的缓存破坏

问题描述

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

发现与 DLL 相同的问题

标签: blazorblazor-client-side

解决方案


我和我的同事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 服务器总是在标头中返回实际版本:
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>

推荐阅读