从ASP.NET禁用所有浏览器的浏览器缓存

从ASP.NET禁用所有浏览器的浏览器缓存,asp.net,http,browser,caching,Asp.net,Http,Browser,Caching,我在寻找一个明确的参考什么ASP.NET代码需要禁用浏览器缓存页面。有很多方法可以影响HTTP头和元标记,我得到的印象是,要让不同的浏览器正常工作,需要不同的设置。如果能得到一段注释的参考代码,指出哪些适用于所有浏览器,哪些是特定浏览器(包括版本)所必需的,那就太好了 关于这个问题,有大量的信息,但是我还没有找到一个好的参考资料来描述每种方法的优点,以及某项技术是否已经被更高级别的API所取代 我对ASP.NET3.5SP1特别感兴趣,但如果能找到早期版本的答案也不错 本博客描述了一些HTTP协

我在寻找一个明确的参考什么ASP.NET代码需要禁用浏览器缓存页面。有很多方法可以影响HTTP头和元标记,我得到的印象是,要让不同的浏览器正常工作,需要不同的设置。如果能得到一段注释的参考代码,指出哪些适用于所有浏览器,哪些是特定浏览器(包括版本)所必需的,那就太好了

关于这个问题,有大量的信息,但是我还没有找到一个好的参考资料来描述每种方法的优点,以及某项技术是否已经被更高级别的API所取代

我对ASP.NET3.5SP1特别感兴趣,但如果能找到早期版本的答案也不错

本博客描述了一些HTTP协议行为差异

下面的示例代码说明了我感兴趣的类型

public abstract class NoCacheBasePage : System.Web.UI.Page
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        DisableClientCaching();
    }

    private void DisableClientCaching()
    {
        // Do any of these result in META tags e.g. <META HTTP-EQUIV="Expire" CONTENT="-1">
        // HTTP Headers or both?

        // Does this only work for IE?
        Response.Cache.SetCacheability(HttpCacheability.NoCache);

        // Is this required for FireFox? Would be good to do this without magic strings.
        // Won't it overwrite the previous setting
        Response.Headers.Add("Cache-Control", "no-cache, no-store");

        // Why is it necessary to explicitly call SetExpires. Presume it is still better than calling
        // Response.Headers.Add( directly
        Response.Cache.SetExpires(DateTime.UtcNow.AddYears(-1));
    }
}
公共抽象类NoCacheBasePage:System.Web.UI.Page
{
受保护的覆盖无效OnInit(事件参数e)
{
碱基.奥尼特(e);
DisableClientCaching();
}
私有void DisableClientCaching()
{
//这些是否会导致元标记,例如。
//HTTP头还是两者都有?
//这只适用于IE吗?
Response.Cache.SetCacheability(HttpCacheability.NoCache);
//这是FireFox所必需的吗?如果没有神奇的字符串就可以了。
//它不会覆盖以前的设置吗
添加(“缓存控制”,“无缓存,无存储”);
//为什么需要显式调用SetExpires。假设它仍然比调用
//Response.Headers.Add(直接
SetExpires(DateTime.UtcNow.AddYears(-1));
}
}

我知道有两种方法。第一种方法是告诉浏览器不要缓存页面。将响应设置为“无缓存”可以解决这一问题,但您可能会怀疑浏览器通常会忽略此指令。另一种方法是将响应的日期时间设置为将来的某个点。我相信所有浏览器都会这样做当他们将页面添加到缓存时,请将其更正到当前时间,但在进行比较时,页面将显示为较新的页面。我相信可能存在未进行比较的情况。我不确定详细信息,并且这些信息会随着每个新的浏览器版本而变化。 最后一点注意:我对自己“刷新”的页面(另一个响应指令)运气更好。刷新似乎不太可能来自缓存


希望有帮助。

这是我们在ASP.NET中使用的:

// Stop Caching in IE
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);

// Stop Caching in Firefox
Response.Cache.SetNoStore();
它停止在Firefox和IE中缓存,但我们还没有尝试其他浏览器。以下响应头由以下语句添加:

Cache-Control: no-cache, no-store
Pragma: no-cache

无论如何,我必须在我的ASP.NET MVC 3应用程序中处理这个问题

    protected void Application_BeginRequest()
    {
        //NOTE: Stopping IE from being a caching whore
        HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false);
        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        HttpContext.Current.Response.Cache.SetNoStore();
        Response.Cache.SetExpires(DateTime.Now);
        Response.Cache.SetValidUntilExpires(true);
    }

我尝试过各种组合,但在FireFox中失败了。这已经有一段时间了,所以上面的答案可能很好,或者我可能错过了一些东西

对我来说,一直有效的方法是将以下内容添加到每个页面的标题或模板(在.net中的母版页)


window.onbeforeunload=函数(){
//此函数不执行任何操作。它不会生成确认对话框
//但它将确保浏览器不会缓存页面。
}  

这无疑为我禁用了所有浏览器中的所有缓存。

我将测试向我们的站点添加no-store标记,看看这是否会对浏览器缓存产生影响(Chrome有时会缓存页面)。我还发现这篇文章在介绍缓存如何工作以及为什么工作的文档方面非常有用,如果no存储不可靠,我将研究ETag的下一步:


另请参见没有该选项,Chrome可能会重新加载,但会保留
元素以前的内容——换句话说,使用
autocomplete=“off”

如果我不知道你的任务有多么不可能,我会尝试回答。控制客户端的缓存就像尝试使用10英尺长的筷子来重新排列家具。一大堆只涉及问题一部分的答案仍然非常有价值。请投入你的2美分。http://code>HttpContext.Current。Response.Cache.SetAllowResponseInBrowserHistory(false)为防止bith IE和FireFox-1中的缓存做了改变,这些应用程序中的设置\u BeginRequest()会导致为您可能需要缓存的项目(JavaScript文件、图像等)发送无缓存头。我还没有尝试过,但是OP的位置(在ASP页面本身中设置标题)可能更好。我确实希望这个答案能起作用,因为它是在glabal.asax中设置的最整洁的方式,但没有乐趣yet@Evan,仅对从IIS发送到ASP.NET的请求调用应用程序_BeginRequest。很多时候,静态文件(如CSS、JS、图像、字体等)都是扩展名,它们被视为来自IIS的静态文件,而不是发送到ASP.NETASP.NET运行时。如果将IIS设置为将所有请求发送到ASP.NET运行时,则“是”,这将适用于所有请求,即使文件是静态的且应缓存。@Adam,这是有意义的。我将撤消我的-1,但我的投票已锁定:-(+1这在Chrome中对我有效,非常感谢。我还使用Response.Cache.SetAllowResponseInBrowserHistory(true);以避免历史记录为同一页面的每个请求存储一个条目。显然有人发现,将SetCacheability与NoCache一起使用也会禁用ASP.NET输出缓存(服务器端缓存)。他们建议改为使用ServerAndNoCache选项。为了澄清代码段中的注释,主要方法是
SetCacheability
SetNoStore
是IE6的一种变通方法。请参阅.FWIW…需要为IE10添加SetNoStore,以便阅读此页面的人
<script language="javascript" type="text/javascript">
    window.onbeforeunload = function () {   
        // This function does nothing.  It won't spawn a confirmation dialog   
        // But it will ensure that the page is not cached by the browser.
    }  
</script>