【问题标题】:Disabling browser caching for all browsers from ASP.NET从 ASP.NET 禁用所有浏览器的浏览器缓存
【发布时间】:2010-10-29 04:19:06
【问题描述】:

我正在明确参考禁用浏览器缓存页面所需的 ASP.NET 代码。有很多方法可以影响 HTTP 标头和元标记,我的印象是需要不同的设置才能让不同的浏览器正常运行。如果能获得一段参考代码注释以指明哪些代码适用于所有浏览器以及哪些代码适用于特定浏览器(包括版本),那将是非常棒的。

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

我对 ASP.NET 3.5 SP1 特别感兴趣,但如果能获得早期版本的答案也会很好。

此博客条目Two Important Differences between Firefox and 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));
    }
}

【问题讨论】:

  • 如果我不知道你的任务有多可怕,我会尝试回答。控制客户端的缓存就像试图用 10 英尺长的筷子重新排列家具一样。
  • 仅涵盖部分问题的大量答案仍然非常有价值。请投入您的 2 美分。

标签: asp.net http browser caching


【解决方案1】:

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

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • +1 这在 Chrome 中对我有用,非常感谢。我也使用 Response.Cache.SetAllowResponseInBrowserHistory(true);以避免历史记录为同一页面的每个请求存储一个条目。
    • 显然有人发现将 SetCacheability 与 NoCache 一起使用也会禁用 ASP.NET 输出缓存(服务器端缓存)。他们建议改用 ServerAndNoCache 选项。 codeclimber.net.nz/archive/2007/04/01/…
    • 为了澄清代码sn-p中的cmets,主要方法是SetCacheabilitySetNoStore 是一种 IE6 解决方法。见Why both no-cache and no-store should be used in HTTP response?
    • FWIW ... 需要为 IE10 添加 SetNoStore
    • 对于那些阅读此页面的人,他们将通过 https 输出动态 PDF 并像这样设置缓存头,请注意以下 IE8 和更低的错误:stackoverflow.com/questions/1038707/…
    【解决方案3】:

    对于它的价值,我只需要在我的 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 中缓存
    • -1,在这些 Application_BeginRequest() 中设置会导致为您可能想要缓存的项目(JavaScript 文件、图像等)发送无缓存标头。我还没有尝试过,但是 OP 的位置(在 ASP 页面本身中设置标题)可能更好。
    • 我确实希望这个答案能奏效,因为它是在 glabal.asax 中设置它的最简洁的方式,但还没有乐趣
    • @Evan,只有从 IIS 发送到 ASP.NET 的请求才会调用 Application_BeginRequest。很多时候,CSS、JS、图像、字体等静态文件是被视为来自 IIS 的静态文件而不发送到 ASP.NET 运行时的扩展。如果 IIS 设置为将所有请求发送到 ASP.NET 运行时,那么是的,这将适用于所有请求,即使文件是静态的并且应该被缓存。
    • @Adam,有道理。我会撤消我的 -1 但 SO 说我的投票被锁定了:-(
    【解决方案4】:

    我尝试了各种组合,但在 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>
    

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

    【讨论】:

    【解决方案5】:

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

    http://www.mnot.net/cache_docs/

    http://en.wikipedia.org/wiki/HTTP_ETag

    【讨论】:

      【解决方案6】:

      另请参阅How to prevent google chrome from caching my inputs, esp hidden ones when user click back?,如果没有它,Chrome 可能会重新加载,但会保留&lt;input&gt; 元素的先前内容——换句话说,使用autocomplete="off"

      【讨论】:

        猜你喜欢
        • 2018-06-29
        • 2013-08-13
        • 1970-01-01
        • 2015-09-30
        • 2016-10-01
        • 1970-01-01
        • 2012-01-05
        • 2018-08-30
        • 1970-01-01
        相关资源
        最近更新 更多