主控制器和索引操作执行此操作:
public ActionResult RedirectIndex() { return new PhysicalFileResult(Path.Combine(_hostingEnvironment.WebRootPath, "index.html"), new MediaTypeHeaderValue("text/html")); }我还在我的Startup.cs中使用app.UseDefaultFiles();和app.UseStaticFiles();,但没有缓存控件。
这是在Azure上的Web应用中托管的。
当我像这样导航到我的应用程序时:my-app/然后默认路线开始生效,我得到了我的index.html。一切都按预期进行。只是我得到了一个缓存的index.html,它引用了我的旧js和旧css文件。
注意!我不会从Azure托管站点删除我的旧js和css文件,因此当缓存的index.html引用旧文件时,它们会得到毫无问题的服务。
因为index.html被缓存,所以我的用户得到了js逻辑的旧版本,但是服务器被更新了,所以我的web API发送了js无法处理的更新的东西--我崩溃了。我必须告诉我的用户ctrl+Shift+r进行硬刷新,然后一切就都正常了。
还有最后一块拼图。当我注销时,我将用户重定向到auth0(一种身份验证服务)以执行注销。然后,该服务(Auth0)将用户重定向回My Site(my-app/)并猜猜发生了什么--他们再次获得缓存的旧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始终可以解决此问题。不管怎样。这个问题似乎可以通过以下公认的答案得到解决:stackoverflow/a/38235096
即使我使用稍微定制的PhysicalFileResult(),StaticFilesOptions()也会起作用,并且我每次重新加载时都会得到200状态代码。我的index.html非常小,所以这是完全可以的解决方案。
希望这对其他人有帮助。
更多推荐
Web API中SPA路由的ASP.NET核心缓存问题
发布评论