【问题标题】:Setting ASP.NET Cache control headers设置 ASP.NET 缓存控件标头
【发布时间】:2025-12-16 09:05:02
【问题描述】:

在我的 asp.net 表单应用程序中。我试图阻止某些页面的缓存。 为此,我使用 Response.AppendHeader 设置了一系列缓存控制标头 例如

受保护的覆盖无效 OnLoad(Eventargs e) { ... Response.ClearHeaders(); Response.AppendHeader("缓存控制","无缓存"); …… base.OnLoad(e); }

问题是当我查看我的站点并查看 Firefox 控制台中的“网络”选项卡以查看请求/响应标头时,我看到如下行为:

  1. page1.aspx 的 POST 请求/响应触发重定向(到 page2.aspx) 此处的响应包含正确的标头。

  2. page2.aspx 的 GET 请求/响应 相关响应的缓存控制标头只有一个值 'pre-check=0'

第二个请求似乎允许对页面进行缓存.. 注意:page1.aspx 和 page2.aspx 都有我上面描述的 OnLoad 逻辑。此外,如果我对 page2.aspx 采取一些措施,POST 响应将再次具有正确的标头。

我在这里缺少什么?我的期望是 OnLoad 中的逻辑应该意味着我总是得到响应中的标题,因此“总是”得到页面的当前版本?

我看到的是 Firefox 正在加载它的页面缓存版本。

我正在考虑在请求 url 中创建一个随机标识符来强制执行此操作,但这似乎有点笨拙。

-----更新----- 看来,这可能与“OnLoad”中有缓存代码有关。 我已将这些标题添加到页面的 Page_Load() 中,它工作正常吗? 任何想法。

【问题讨论】:

    标签: asp.net webforms


    【解决方案1】:

    尝试将Response.AppendHeader("Cache-Control","no-cache"); 换成

    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetNoStore();
    

    并确保您没有@ OutputCache directive,也不是explicitly preventing cache control。请参阅this MSDN page on SetCacheabilitySetNoStore

    【讨论】:

    • 见我上面的附加说明。
    • @TygerKrash 你的标题会在某个时候被覆盖吗? base.OnLoad 会发生什么?您能否单步执行代码并 a) 验证设置缓存控制的代码是否已命中并 b) 观察响应对象以查看它在哪里发生变化?
    【解决方案2】:

    你可以试试这个页面指令:

    <%@ OutputCache Location="None" VaryByParam="None" %>
    

    另请参阅:How to: Set the Cacheability of an ASP.NET Page Declaratively

    【讨论】:

    • 这行代码与Server-Side缓存有关。该问题仅与客户端缓存有关,这是完全不同的情况。