ASP.NET核心 - 在Web API中缓存SPA路由的问题

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

好吧,我不确定我的缓存的确切问题是什么,但我倾向于在我的WebAPI中使用SPA路由回退。对于一篇相当混乱的帖子感到抱歉,我知道缓存破坏是SO和博客上的热门话题,但我找不到解决问题的方法。

首先简要概述解决方案。我正在使用webpack将我的前端代码捆绑到或多或少的一个css,一个js和一个index.html。我100%确定这个index.html引用了这些独特的css和js文件,并且哈希在每个构建/发布时都是唯一的。 Webpack将这些文件复制到我的ASP.NET Core项目和wwwroot目录中。在我的ASP.NET核心代码中,我设置了我的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路线重定向吗?是Azure吗?我应该只重命名我的index.html每个构建并引用那个唯一的index.html吗? (这将是一个明显的解决方案,但然后我的webpack配置需要操纵我的C#服务器代码,这让我感到厌烦)

asp.net azure caching webpack single-page-application
1个回答
0
投票

经过一些调查后,我得出结论,当指定的文件(index.html)没有缓存控制头时,它必须是由某些内置自定义逻辑缓存的浏览器。或者也许是添加了这个的Azure Web服务器?

Chrome指示了index.html(未修改)的状态代码304,即使它已被Azure中的插槽交换修改。我尝试使用FTP客户端修改文件,并在重新加载和状态代码200之后给了我新版本。但是当将新版本发布到舞台插槽(使用新的index.html)时,我仍然收到旧版本的阶段环境和状态代码304.也许这是因为我停止了网站,发布然后再次启动它(??)。当我将我的舞台插槽换成我的制作插槽时,生产index.html再次更新,但Chrome在重新加载后对生产环境说304(未修改)。 Ctrl + Shift + R始终可以解决此问题。

无论如何。问题似乎是通过这个公认的答案来解决的:https://stackoverflow.com/a/38235096

即使我使用稍微自定义的PhysicalFileResult(),StaticFilesOptions()也会启动,每次重新加载都会获得200状态代码。我的index.html非常小,所以这是完美的解决方案。

希望这有助于其他人。

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