处理缓存和浏览器后退按钮的最佳方法是什么?

时间:2020-03-05 18:42:11  来源:igfitidea点击:

处理用户返回到在asp.net应用程序中已缓存项目的页面的最佳方法是什么?是否有捕获后退按钮(事件?)并以这种方式处理缓存的好方法?

解决方案

回答

最好的解决方法是在ASP.NET页(如果使用的是母版页)中放置一个无缓存指令。我认为没有办法直接在ASP.NET代码中处理此问题(因为缓存决策是在客户端上发生的)。

至于MVC,不知道如何实现(假设它与基于Web窗体的ASP.NET不同)。我没用过

回答

据我所知(或者至少已读过),最好不要尝试响应用户事件,而应该考虑"在页面中"。

设计应用程序,以便它不在乎是否按下后退按钮。它将只处理它。 。

也就是说,如果第3步执行了一些数据更改,则用户单击返回(转到第2步),然后再次单击下一步,然后应用程序检查以查看是否已进行了更改。或者理想情况下,它直到用户才进行任何硬更改单击最后的"确定"。这样,所有更改都将被存储,并且我们可以基于每次加载时先前输入的值重新填充表单。

我希望这是有道理的 :)

回答

我们可以尝试使用HttpResponse.Cache属性,如果这样做会有所帮助:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;

if (Response.Cache.VaryByParams["Category"])
{
   //...
}

或者可以与HttpResponse.CacheControl一起完全阻止页面的缓存,但是不赞成使用该方法,而推荐使用上面的Cache属性:

Response.CacheControl = "No-Cache";

编辑:或者我们真的可以发疯,用手做这一切:

Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.1 
Response.AppendHeader("Keep-Alive", "timeout=3, max=993"); // HTTP 1.1 
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.1

回答

RFC 2616 13.13表示历史记录和缓存是不同的东西。缓存绝对没有办法影响"后退"按钮。

如果HTTP标头的任何组合影响"后退"按钮,则这是浏览器中的一个错误,只有一个例外。

在HTTPS浏览器中,当使用"后退"按钮(Mozilla称其为"傻银行模式")时,将"缓存控制:必须重新验证"解释为刷新页面的请求。普通HTTP不支持此功能。