1

我似乎有一个问题,我找不到解决方案....我有一个 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;
4

2 回答 2

6

问题

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

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

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

解决方案

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

有关如何在 ASP.net 以帖子为中心的处理方式中完成此操作的更多信息,请查看此 stackoverflow 帖子。@Solburn 提供的示例是本文中最好的示例。

于 2012-07-30T04:21:14.797 回答
0

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

<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>
于 2012-08-21T15:39:58.330 回答