【问题标题】:ASP.NET browser shows "web page has expired" for back button (after a post back)ASP.NET 浏览器显示“网页已过期”的后退按钮(回发后)
【发布时间】:2012-04-04 05:27:09
【问题描述】:

我在使用简单的 ASP.NET 应用程序和回发后的返回按钮时遇到问题。

有问题的页面上有一个简单的表单、一些文本字段等,以及一个执行回发(自动回发)的下拉菜单。

“正常”流程是用户填写表单并可能更改下拉列表。根据下拉值,页面内容可能会发生变化。

我遇到的问题是,在用户更改了下拉列表并且回发完成后,用户单击了后退按钮。他们看到来自 IE 的“网页已过期”消息。

我设置了以下内容:

Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.Private);

但这似乎并没有解决问题。

实际的 Cache-Control 响应头读取为:private, no-cache:"Set-Cookie"

在经典的 ASP 应用程序中,带有只是“私有”的 Cache-Control 响应标头的后退按钮在“回发”之后的行为与预期一样。

是否有强制 ASP.NET 将缓存控制显式设置为完全“私有”?或者任何其他可以使后退按钮和回发一起工作的解决方案?

谢谢!

【问题讨论】:

    标签: asp.net back-button cache-control


    【解决方案1】:

    根据具体情况,您可能会摆脱这种黑客/解决方法:

     private void Page_PreRender(object sender, System.EventArgs e)
        {
            if (IsPostBack && !IsCallback)
            {
    
                Response.Write("<html><head><script>location.replace('" + Request.Path + "');\n" + "</script></head><body></body></html>\n");
    
                Response.End();
    
            }
    
        }
    

    【讨论】:

      【解决方案2】:

      您正在处理的实际上是一个老问题。本质上,您看到“网页已过期”消息的原因是使用了一种禁用“后退”按钮的技术。该技术将缓存设置为过去的日期,因此如果用户单击“返回”按钮,则会导致浏览器显示此错误。

      就是这行代码:

      Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1)); 
      

      这一直是个问题,尤其是对于 WebForms ASP.NET,因为与其他框架相比,回发是如何工作的。

      要全面了解所涉及的所有问题,我强烈建议您阅读下面链接的文章。它不会直接回答您的问题,但我认为您会从中获得比简单答案更多的信息,并将帮助您思考您的选择,更好地理解手头的问题。请务必阅读第 1 部分和第 2 部分。

      http://www.4guysfromrolla.com/webtech/111500-1.shtml

      我确实知道如何使“返回”按钮再次像“返回”按钮一样工作,这样回发就不会被视为页面导航:

      就我个人而言,当我不希望后退/后退按钮冲突时,我采用了一种(可以说是粗俗/草率)的方法,即只将内容放入 UpdatePanel 中,因为无论如何我在大多数应用程序中都使用 Ajax。这会强制“返回”按钮实际返回到上一页,而不是停留在同一页面上,而是恢复到回发之前的控制值。

      【讨论】:

      • 对我来说,将到期时间设置为 -1 分钟、缓存控制私有的经典 ASP 应用程序让后退按钮“按预期”工作,但 ASP.NET 应用程序的到期时间设置为-1 分钟,缓存控制设置为“private,no-cache:set cookie”不会。这对我来说似乎指向“no-cache:set cookie”作为问题。
      • 我明白了。不同之处在于 Classic ASP 没有需要应对的回传。单击按钮会触发表单的“操作”,每次都是全新的页面加载。在 ASP.NET 中,如果您更改下拉列表,并且该下拉列表将“autopostback”设置为 true,那么浏览器实际上会将其视为对新页面的导航。这完全取决于回发的实现方式,在这种情况下,这是一个持续不断的烦恼来源。从技术上讲,更改 autompostback 的下拉集确实会触发表单上的“发布”选项,但 WebForms 范式模糊了它...
      • 也许这是一个更好的解释——对于浏览器来说,每次回发实际上是一个新的页面访问,并且它被存储在历史中,即使 WebForms 范式试图让它看起来不像那样开发者。
      • 在我提到的经典 ASP 示例中,我提到了一个“回发”……表单数据被 POST 到服务器的同一页面(即与 ASP.NET 帖子相同)背部)。再说一遍......在我看来,唯一的区别是“private”与“private,no-cache:set-cookie”的缓存控制响应标头。
      猜你喜欢
      • 2010-11-17
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      相关资源
      最近更新 更多