ASP.NET网页过期缓存问题

时间:2012-07-24 20:57:35

标签: asp.net caching cache-control

我似乎遇到了问题而我找不到解决方案....我有一个ASP.NET搜索表单,当用户点击结果然后点击浏览器的后退按钮时,用户就会被引导到页面上显示“网页已过期”

我知道这是缓存问题,这就是我尝试过的......

protected void Page_Init(object sender, EventArgs e)
{
    Response.AppendHeader("Cache-Control", "no-cache"); 
}

protected void Page_Init(object sender, EventArgs e)
{
    Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
    Response.AppendHeader("Pragma", "no-cache");
    Response.AppendHeader("Expires", "0");
}

并且这些解决方案似乎都不起作用,任何人都知道为什么?

我也试过了......

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

但它没有用。

我做了更多的挖掘,我用Fiddler检查我的标题,它说Cache-Control: private, no-store, must-revalidate我没有将我的Cache-Control设置为私有的...我只有进口,是否可能我的导入中有一个Cache-Control吗?

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

using CMS.UIControls;
using CMS.GlobalHelper;
using CMS.CMSHelper;
using CMS.Controls;

2 个答案:

答案 0 :(得分:6)

问题

此问题与缓存控制标头无关。对于包含和不包含缓存标头的搜索结果页面,您会看到类似的错误。

这里的问题是您的搜索表单是通过Http POST提交的。这意味着搜索字段作为POST主体的一部分提交给服务器。浏览器将其视为表单提交(就像提交联系页面一样)。浏览器内置了一种机制,可以防止多次重新发布相同的表单,因为没有经验的用户可能会在不知情的情况下偶然发现这种情况。

例如,假设您有一个向您发送公司电子邮件的联系表单。用户可以通过发布表单向您发送消息,然后单击“返回”,“转发”,“返回”,“转发”,“返回”,“转发”,您不希望收到3或4份副本同样的消息。因此,当您导航回到表单POST结果的页面时,浏览器会发出警告(某些浏览器允许您单击“再次提交”,但这不是必需的。)

解决方案

好的,答案是什么?您需要通过Http GET方法提交搜索查询。这通常会导致搜索字符串出现在搜索结果页面的查询字符串中。例如,Google在大多数情况下在查询字符串变量'q'中对其搜索字符串进行编码。您可能有一个看起来像'SearchResults.aspx?q = Test%20Phrase'的页面。请注意,搜索短语是在查询字符串中提供的(作为页面URL的一部分)而不是在POST正文中?

有关如何在ASP.net以邮件为中心的方式完成签出this stackoverflow post的方法中实现此目的的更多信息。 @Solburn提供的示例是此帖子中最好的示例。

答案 1 :(得分:0)

BenSwayne已经完美地回答了这个问题。 在此之上。 当您使用.Net的ImageButton控件时,这是常见问题 E.g。

<asp:ImageButton ID="ibnDisplayImage" runat="server" ImageUrl="test.jpg" 
PostBackUrl="~/home.aspx" />

所以要避免这个问题。使用以下代码。

<a href="~/home.aspx"><img src="test.jpg" /> </a>

<asp:HyperLink ID="lnkDisplayImage" runat="server" NavigateUrl="~/home.aspx" > <asp:Image ID="imgDisplayImage" runat="server" ImageUrl="test.jpg" /> </asp:HyperLink>