【发布时间】:2010-09-06 14:09:47
【问题描述】:
处理用户返回到在 asp.net 应用程序中缓存项目的页面的最佳方法是什么?有没有一种捕获后退按钮(事件?)并以这种方式处理缓存的好方法?
【问题讨论】:
标签: asp.net caching back-button
处理用户返回到在 asp.net 应用程序中缓存项目的页面的最佳方法是什么?有没有一种捕获后退按钮(事件?)并以这种方式处理缓存的好方法?
【问题讨论】:
标签: asp.net caching back-button
如果有帮助,您可以尝试使用HttpResponse.Cache property:
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";
编辑:或者您真的可以 go nuts 并手动完成所有操作:
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
【讨论】:
据我所知(或至少已阅读)最好不要响应用户事件,而是“在页面中”思考..
设计您的应用程序,这样它就不会关心是否按下了后退按钮。它只会处理它。从开发的角度来看,这可能意味着一些额外的工作,但总体而言会使应用程序变得很多更健壮..
即,如果第 3 步执行了一些数据更改,则用户单击返回(到第 2 步)并再次单击下一步,然后应用程序检查是否已进行更改。或者理想情况下,它不会进行任何 hard 更改,直到用户最后单击“确定”。这样,所有更改都将被存储,您可以根据之前输入的加载值重新填充表单,每次..
我希望这是有道理的:)
【讨论】:
RFC 2616 §13.13 表示历史和缓存是不同的东西。缓存应该绝对不会影响返回按钮。
如果 HTTP 标头的任何组合影响后退按钮,这是浏览器中的一个错误……除了一个例外。
在 HTTPS 中,浏览器将 Cache-control: must-revalidate 解释为使用后退按钮时刷新页面的请求(Mozilla 称之为“傻银行模式”)。这在普通 HTTP 中不受支持。
【讨论】:
处理它的最佳方法可能是在您的 ASP.NET 页面中放置一个 no-cache 指令(或者如果您正在使用一个母版页)。我认为没有办法直接在您的 ASP.NET 代码中处理这个问题(因为缓存决定发生在客户端上)。
至于 MVC,不知道如何实现(假设它不同于基于 Web 窗体的 ASP.NET);我没用过。
【讨论】:
以下代码在 IE9+、FF21 和最新版 Chrome 中适用于我:
Response.Cache.SetCacheability(HttpCacheability.NoCache | HttpCacheability.Private);
Response.Cache.AppendCacheExtension("must-revalidate");
Response.Cache.AppendCacheExtension("max-age=0");
Response.Cache.SetNoStore();
您可以将其放置在 MasterPage 的 Page_Load() 事件处理程序中,以便您的应用中的每个页面在按下后退按钮时都需要往返于服务器。
【讨论】: