我有一个运行时生成的脚本,它包含一些标签的翻译。它的目的是公开 AngularJS 的翻译。
app.MapWhen(current => current.Request.Path.StartsWithSegments(path),
mapped => mapped.UseMiddleware<ClientResourcesMiddleware>(options)
);
脚本已加载到布局中:
<script src="path" />
这将触发
ClientResourceMiddleware
并在其响应中加载脚本。效果非常好。
我遇到的问题是当我切换语言(个人资料页面)并导航回上一页时。该脚本不会重新加载,而是会被缓存,因此我得到的是以前的翻译,而不是具有新语言集的新翻译。
我已经尝试过:
asp-append-version="true"
查看网络监视器,我看到了“缓存”标签。当我刷新页面时,就会加载新文件。
知道如何解决这个问题吗?
基于@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
,这将使文件每次都重新加载。