【发布时间】:2017-12-14 20:41:08
【问题描述】:
好的,我不太确定缓存的确切问题是什么,但我倾向于在我的 WebAPI 中使用我的 SPA 路由回退。抱歉发了一篇相当混乱的帖子,我知道缓存破坏是 SO 和博客上的热门话题,但我就是找不到解决问题的方法。
首先简要概述解决方案。我正在使用 webpack 将我的前端代码捆绑成或多或少的一个 css、一个 js 和一个 index.html。我 100% 确定这个 index.html 引用了这些唯一的 css 和 js 文件,并且每个构建/发布的哈希值都是唯一的。 Webpack 将这些文件复制到我的 ASP.NET Core 项目和 wwwroot 目录中。在我的 ASP.NET Core 代码中,我设置了 MVC 路由,如下所示:
app.UseMvc(routes =>
{
routes.MapRoute("api", "api/{controller=Controller}/{action=Index}/{id?}");
routes.MapRoute("default", "{*url}", new {controller = "Home", action = "RedirectIndex"});
});
主控制器和索引操作执行以下操作:
public ActionResult RedirectIndex()
{
return new PhysicalFileResult(Path.Combine(_hostingEnvironment.WebRootPath, "index.html"), new MediaTypeHeaderValue("text/html"));
}
我也使用 app.UseDefaultFiles();和 app.UseStaticFiles();在我的 Startup.cs 但没有缓存控制。
这是托管在 Azure 上的 Web 应用程序中。
当我像这样导航到我的应用程序时:https://my-app.com/ 然后默认路由启动,我得到了我的 index.html。一切都按预期工作。除了我得到一个缓存的 index.html 引用我的旧 js 和旧 css 文件。
注意!我不会从 Azure 托管站点中删除我的旧 js 和 css 文件,因此当缓存的 index.html 引用旧文件时 - 它们会毫无问题地得到服务。
由于 index.html 被缓存,我的用户获得了旧版本的 js 逻辑,但服务器已更新,因此我的 web api 发送了 js 无法处理的更新内容 - 我遇到了崩溃。我必须告诉我的用户按 ctrl + shift + r 进行硬刷新,然后一切正常。
还有最后一块拼图。当我注销时,我将用户重定向到 auth0(身份验证服务)以执行注销。该服务(auth0)然后将用户重定向回我的站点(https://my-app.com/)并猜猜是什么 - 他们再次获得旧的缓存 index.html,即使他们只是 ctrl+shift+r 刷新了同一个站点几分钟早一点。
我对此感到非常困惑 - 是浏览器 (Chrome) 执行此缓存吗?是我使用 PhysicalFileResult() 进行的神奇 SPA 路由重定向吗?是蔚蓝吗?我是否应该在每次构建时重命名我的 index.html 并引用那个唯一的 index.html? (这将是一个显而易见的解决方案,但是我的 webpack 配置需要操纵我的 C# 服务器代码,这让我毛骨悚然)
【问题讨论】:
-
我认为您可以在
RedirectIndex控制器操作上设置[ResponseCache(NoStore =true, Location =ResponseCacheLocation.None)]。
标签: asp.net azure caching webpack single-page-application