Web API中SPA路由的ASP.NET核心缓存问题 [英] ASP.NET Core - Cache problems with SPA route in Web API

查看:44
本文介绍了Web API中SPA路由的ASP.NET核心缓存问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好吧,我真的不确定我的缓存到底有什么问题,但我倾向于在我的WebAPI中使用我的SPA路由后备。很抱歉发表了一篇相当凌乱的帖子,我知道缓存崩溃是这里和博客上的热门话题,但我就是找不到解决问题的办法。

首先简要概述该解决方案。我使用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"));
}

我还在我的Startup.cs中使用app.UseDefaultFiles();和app.UseStaticFiles();,但没有缓存控件。

这是在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)将用户重定向回My Site(https://my-app.com/)并猜猜发生了什么--他们再次获得缓存的旧index.html,尽管他们在几分钟前刚刚刷新了同一站点。

我对此感到非常困惑--是浏览器(Chrome)执行这种缓存吗?这是我使用PhysicalFileResult()进行的神奇SPA路由重定向吗?是蔚蓝吗?我应该只重命名每个构建的index.html并引用唯一的index.html吗?(这将是一个显而易见的解决方案,但我的webpack配置需要操作我的C#服务器代码,这让我毛骨悚然)

推荐答案

经过进一步研究,我得出结论,当指定的文件(index.html)没有缓存控制标头时,一定是浏览器通过一些内置的定制逻辑进行缓存。或者可能是Azure Web服务器添加了此内容?

Chrome显示了index.html的状态代码304(未修改),即使它已通过Azure中的插槽交换进行了修改。我试着用一个ftp客户端修改这个文件,重新加载后得到了新版本,状态代码为200。但是,在将新版本发布到舞台槽(具有新的index.html)时,我仍然在舞台环境中收到旧版本和状态代码304。也许这是因为我停止网站,发布,然后重新启动(??)。当我将我的舞台槽换到我的生产槽时,ProductIndex.html再次更新,但Chrome在重新加载后显示Produciton环境为304(未修改)。Ctrl+Shift+R始终可以解决此问题。

不管怎样。这个问题似乎可以通过以下公认的答案得到解决:https://stackoverflow.com/a/38235096

即使我使用稍微定制的PhysicalFileResult(),StaticFilesOptions()也会起作用,并且我每次重新加载时都会得到200状态代码。我的index.html非常小,所以这是完全可以的解决方案。

希望这对其他人有帮助。

这篇关于Web API中SPA路由的ASP.NET核心缓存问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆