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


87

我在明确引用了哪些ASP.NET代码才能使浏览器无法缓存页面。有多种方法可以影响HTTP标头和meta标记,并且给人的印象是,要使不同的浏览器正常运行,需要进行不同的设置。获得一段注释的参考代码来指示哪种代码对所有浏览器都有效,以及对于特定的浏览器(包括版本)是必需的,这真的很棒。

那里有关于此问题的大量信息,但是我还没有找到一个很好的参考来描述每种方法的好处,以及是否已被更高级别的API取代了特定技术。

我对ASP.NET 3.5 SP1特别感兴趣,但是也可以获取早期版本的答案。

此博客条目Firefox和IE Caching之间的两个重要区别描述了一些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));
    }
}

5
如果我不知道您的任务多么可怕,我会尝试回答。控制客户的缓存就像尝试使用10英尺长的筷子重新布置家具。
Jeff Meatball Yang

涵盖一部分问题的大量答案仍然非常有价值。请投入您的2美分。
Martin Hollingsworth,

Answers:


96

这是我们在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

5
+1这非常适合我在Chrome中使用,非常感谢。我也使用Response.Cache.SetAllowResponseInBrowserHistory(true); 避免历史记录来存储同一页面的每个请求的条目。
daniloquio 2012年

12
显然有人发现将SetCacheability与NoCache一起使用还会禁用ASP.NET输出缓存(服务器端缓存)。他们建议改为使用ServerAndNoCache选项。codeclimber.net.nz/archive/2007/04/01/…–
md1337

1
为了澄清代码段中的注释,主要方法是SetCacheabilitySetNoStore是IE6的解决方法。请参阅为什么在HTTP响应中同时使用no-cache和no-store?
爱德华·布雷

3
FWIW ...需要为IE10添加SetNoStore
felickz

对于那些阅读此页,谁就会通过HTTPS动态输出PDF和设置缓存头这样的,请谨防以下IE8和更低的错误:stackoverflow.com/questions/1038707/...
水稻

41

对于它的价值,我只需要在ASP.NET MVC 3应用程序中处理即可。这是我在Global.asax文件中用于处理所有请求的代码块。

    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);
    }

HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false)做的差,以防止缓存在bith IE和Firefox
迈克尔Kniskern

2
-1,在这些Application_BeginRequest()中进行设置会导致发送您可能希望缓存的项目(JavaScript文件,图像等)的非缓存头。我还没有尝试过,但是OP的位置(在ASP页本身中设置标题)可能更好。
埃文·哈斯

我确实希望这个答案能奏效,因为它是将其设置在glabal.asax中的最简洁的方法,但还没有带来喜悦
lawphotog 2013年

5
@ Evan,Application_BeginRequest仅将用于从IIS发送到ASP.NET的请求。很多时候,静态文件(如CSS,JS,图像,字体等)是扩展名,被视为IIS中的静态文件,并且不会发送到ASP.NET运行时。如果将IIS设置为将所有请求发送到ASP.NET运行时,则可以,这适用于所有请求,即使文件是静态的并且应该缓存也是如此。
亚当·卡尔

@Adam,很有道理。我会撤消我的-1,但SO表示我的投票锁定在:-(
Evan Haas

2

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

对我来说一直有效的是将以下内容添加到每个页面或模板(.net中的母版页)的开头。

<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>

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


7
不知道这应该怎么做,但它看起来确实像是一个大型胖子,在这些浏览器的下一次更新中注定会失败。
md1337'3

有关详细信息,请参见例如web.archive.org/web/20160112095216/http://www.hunlock.com/blogs/…-总而言之,onbeforeunload事件已实现为银行使用并防止页面被缓存。
ChrisW

1

我知道两种方法。首先是告诉浏览器不要缓存页面。将Response设置为no cache可以解决此问题,但是由于您怀疑浏览器经常会忽略此指令。另一种方法是将响应的日期时间设置为将来的某个时间点。我相信所有浏览器在将页面添加到缓存时都会将其更正为当前时间,但是在进行比较时它将显示页面为较新的页面。我相信在某些情况下可能无法进行比较。我不确定这些细节,它们会随每个新的浏览器版本而变化。最后一点,我希望自己能“刷新”页面(另一个响应指令)。刷新似乎不太可能来自缓存。

希望能有所帮助。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.