ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在明确参考禁用浏览器缓存页面所需的 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 美分。

H
HttpWatchSupport

这是我们在 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/…
为了澄清代码片段中的注释,主要方法是 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/…
A
Adam Carr

对于它的价值,我只需要在我的 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 说我的投票被锁定:-(
S
Steve

我尝试了各种组合并让它们在 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>

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


不知道这应该做什么,但它看起来确实像一个大黑客,在任何这些浏览器的下一次更新中肯定会失败。
例如,web.archive.org/web/20160112095216/http://www.hunlock.com/blogs/… 对此进行了解释——总而言之,onbeforeunload 事件被实现以供银行使用并防止页面被缓存。
P
Pat O

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

希望有帮助。


T
The Coder

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

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

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


C
Community

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