【问题标题】:HTTP Response Headers (cache clearing) across an entire solution整个解决方案中的 HTTP 响应标头(缓存清除)
【发布时间】:2014-06-30 11:40:17
【问题描述】:

我有一个包含大量 aspx 页面的解决方案。我们还在一个 CSS/js 文件相对定期更改的环境中工作(比我的开发团队更频繁,我更喜欢)。当我们进行这些 CSS/js 更改时,这给我们的用户带来了一个问题,因为我们的用户最终会遇到缓存冲突。我们通常会指导他们清除缓存并解决所有问题,但我们不必立即告诉他们清除缓存。

所以我使用了我在这里看到的一篇文章中的 HTML 响应标头,以便让用户清除他们的缓存:

Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.

这似乎工作正常。我也想过在我们的js文件上使用querystring参数来强制刷新:

<script src="../js/jquery-1.4.2.min.js?v=1" type="text/javascript"></script>

这可能会帮助我们解决 js/css 缓存问题,但我不相信这是唯一被缓存的页面内容(因此在主要版本期间会引发错误)。

一旦我确信使用 HTML 响应标头可以实现其目标,我也计划申请过期。

所以问题是:我是否必须将这个(作为响应标头)添加到我们解决方案中的每个 aspx 中?我可以将它加载到父框架中并让子 iframe“继承”缓存清除吗?如果不是这样,我可以将它放入母版页并让内容页面从母版页接收这些标题吗?任何见解都会很棒。

【问题讨论】:

    标签: c# html css asp.net caching


    【解决方案1】:

    如果您使用的是母版页,那么在其中设置标题就足够了。

    更广泛地说,这是我们处理这种情况的方式:

    1. 我们使用 Cruise Control 生成一个包含发布的文本文件 每个构建的 id(例如“2014-05-13.001”)
    2. 在 .net 中,我们使用 StreamReader 获取当前 buildId 并存储 它在 Application 对象中
    3. 我们将 id 作为查询字符串参数附加到所有 CSS 和 JS 文件引用中。

    这样,每当我们发布一个版本时,所有的 CSS 和 JS 文件都会被清除并重新加载。缺点是所有文件都被清除了,而不仅仅是那些被修改过的文件,但是我们不会发布很多公开版本,而且它比替代方案要好。

    【讨论】:

    • 我正在以 '' 与 c# function ' protected string getRandomStr() { Random r = new Random(); int rando = r.Next();返回随机数.ToString(); }' 据我所知,这适用于母版页。我更关心单个 aspx 页面。我刚刚了解到 Masters 没有 Page_PreInit,所以这是 c# 方面的一个障碍。我将从 JS/CSS 版本实现开始,然后从那里开始。
    • 随机数方法的缺点是文件将永远被缓存,这不太理想,并且会减慢每个页面的加载速度。
    猜你喜欢
    • 2014-03-21
    • 2013-03-21
    • 2013-12-11
    • 2011-03-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    相关资源
    最近更新 更多