在返回导航ASP.NET Core中禁用js脚本标签的缓存

问题描述 投票:0回答:1

我有一个运行时生成的脚本,它包含一些标签的翻译。它的目的是公开 AngularJS 的翻译。

app.MapWhen(current => current.Request.Path.StartsWithSegments(path),
        mapped => mapped.UseMiddleware<ClientResourcesMiddleware>(options)
    );

脚本已加载到布局中:

<script src="path" />

这将触发

ClientResourceMiddleware
并在其响应中加载脚本。效果非常好。

我遇到的问题是当我切换语言(个人资料页面)并导航回上一页时。该脚本不会重新加载,而是会被缓存,因此我得到的是以前的翻译,而不是具有新语言集的新翻译。

我已经尝试过:

  • 在响应中设置无缓存标头,我认为应该将其放入请求中,但不知道如何在脚本标记中设置它。
  • 添加
    asp-append-version="true"

查看网络监视器,我看到了“缓存”标签。当我刷新页面时,就会加载新文件。

知道如何解决这个问题吗?

angularjs asp.net-core-mvc
1个回答
0
投票

基于@Zinov Comment我按照以下方式实现了它。

为了让浏览器知道资源发生了变化,您可以手动设置目标语言的版本属性,这样即使它发生变化,即使您向后导航,您也会得到所需的版本。

@{ var language = ViewBag["language"]; }

<script src="path?v=@language"></script>

在中间件中:

public async Task Invoke(HttpContext context, IRequestCultureFeature requestCultureFeature)
{
    string script = _cache.GetOrAddValue(
       $"ClientResources|{_options.ResourceType.FullName}|{requestCulture.Name}",
       () => CreateScript(requestCulture));

    context.Response.Headers["Cache-Control"] = "no-cache";

    await context.Response.WriteAsync(script, Encoding.UTF8);
}

另一种选择是使用

DateTime.Now.Ticks
,这将使文件每次都重新加载。

© www.soinside.com 2019 - 2024. All rights reserved.