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

有帮助吗?

解决方案

您可以尝试使用 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 

其他提示

据我所知(或至少读过),最好不要尝试响应用户事件,而是思考“在页面中”。

构建您的应用程序,使其不关心是否按下后退按钮。它只会处理它..从开发的角度来看,这可能意味着一些额外的工作,但总体而言将使应用程序更加健壮。

即,如果步骤 3 执行一些数据更改,则用户单击“返回”(返回步骤 2)并再次单击“下一步”,然后应用程序检查是否已进行更改。或者理想情况下,它不会产生任何 难的 更改直到用户最后单击“确定”。这样,所有更改都会被存储,您可以根据之前每次加载时输入的值重新填充表单。

我希望这是有道理的 :)

RFC 2616 §13.13历史记录和缓存是不同的东西. 。缓存绝对不能影响后退按钮。

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

在 HTTP 中S 浏览器解释 Cache-control: must-revalidate 作为使用后退按钮时刷新页面的请求(Mozilla 称之为“愚蠢的银行模式”)。纯 HTTP 不支持此功能。

处理这个问题的最佳方法可能是在 ASP.NET 页面(或者母版页,如果您使用的是母版页)中放置一个 no-cache 指令。我认为没有办法直接在 ASP.NET 代码中处理这个问题(因为缓存决策是在客户端进行的)。

至于MVC,不知道如何实现这一点(假设它与基于Web Forms的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();

你可以把它放在 Page_Load() MasterPage 中的事件处理程序,以便在按后退按钮时应用程序中的每个页面都需要往返到服务器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top