我有一个包含大量 aspx 页面的解决方案。我们还在 CSS/js 文件相对定期更改的环境中工作(比我的开发团队更频繁,我更喜欢)。当我们进行这些 CSS/js 更改时,这给我们的用户带来了问题,因为我们的用户最终会遇到缓存冲突。我们通常会指示他们清除缓存,这会解决所有问题,但我们不必尽快告诉他们清除缓存。
所以我使用了我在这里看到的帖子中的 HTML 响应 header ,以便让用户清除他们的缓存:
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 响应 header 可以实现其目标,我也计划应用一个过期时间。
所以问题是:我是否必须将此(作为响应 header )添加到我们解决方案中的每个 aspx 中?我可以将它加载到父框架中并让子 iframe“继承”缓存清除吗?如果不是那样,我可以将它放入母版页并让内容页从母版页接收这些标题吗?任何见解都会很棒。
最佳答案
如果您使用母版页,那么在其中设置标题就足够了。
更广泛地说,这是我们处理这种情况的方式:
- 我们使用 Cruise Control 生成包含版本的文本文件 每个构建的 ID(例如“2014-05-13.001”)
- 在 .net 中,我们使用 StreamReader 来获取当前的 buildId 并存储 它在应用程序对象中
- 我们将 id 作为查询字符串参数附加到我们所有的 CSS 和 JS 文件引用中。
这样,每当我们发布一个版本时,所有的 CSS 和 JS 文件都会被清除并重新加载。缺点是所有文件都会被清除,而不仅仅是那些已修改的文件,但我们不会发布很多公开版本,而且它比替代方案要好。
关于c# - 整个解决方案中的 HTTP 响应 header (缓存清除),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23620394/