如果缓存占用者与内容不匹配,则阻止bundle响应

Cur*_*urt 16 asp.net asp.net-mvc caching bundling-and-minification

我在服务器场中使用捆绑和缩小,其中存在旧服务器和新服务器的交叉时段.

我遇到的问题是旧服务器正在缓存新的bundle cache buster URL的内容.


例如,使用新的捆绑包URL 缓存新的 HTML :

<script src="/bundle.css?v=RBgbF6A6cUEuJSPaiaHhywGqT7eH1aP8JvAYFgKh"></script>
Run Code Online (Sandbox Code Playgroud)

然后,它向服务器发出请求,该服务器尚未使用新的CSS代码进行更新,然后缓存.

然后,对捆绑URL的任何后续调用都将返回旧代码.


因此有没有办法检查捆绑包的内容是否与散列缓存破坏者匹配?如果它不抛出404例如.

使用上面的示例,当请求返回到旧服务器的捆绑包时,它将检查捆绑包的内容,生成内容哈希并将其与查询字符串进行比较.

在这种情况下,缓存 - 破坏者将不匹配实际内容散列,并且将返回404.

最终,用户将使用捆绑请求命中服务器,并且将缓存正确的内容.


在此输入图像描述

Mat*_*les 3

我们自己很快就会遇到同样的问题,但我们一直坚持只使用 2 个更新域(将服务器一分为二,以便一次运行的版本不超过一个)。

据我所知,有 4 种可能的选择:

  1. 让您的静态内容始终指向最新的服务器。这可以通过 IP 地址或使用您知道已更新的 URL(如果您有首先更新的服务器)来完成(取决于您的配置)。
  2. 配置负载均衡器,以便来自同一 IP 地址的请求最终到达同一系统(如果您的静态内容由应用服务器提供)。如果无法在负载均衡器级别完成此操作,那么您可以通过为不同环境配置不同的 IP 地址,然后交换其 DNS 记录来进一步完成此操作。
  3. 在 ASP.NET 中实现一个处理程序,用于侦听 CSS 文件,并检查包的哈希值是否符合预期。当您的应用程序加载时生成它们时,您可能需要一个单例对象来存储它们。然后,这可以返回 404、301(让它们重试)或返回旧版本,但指示它不缓存结果。请注意,使用 HttpPipelined,您不太可能访问不同的服务器,因此重定向可能没有帮助。
  4. 在进行部署时设置一个配置标志,将所有缓存清除 URL 更改为当前日期。这将有效地禁用所有缓存,直到部署完成,这意味着将不会保留任何交付的“错误”资产。

这是您实际遇到的问题,还是假设的问题?除非您的网站流量非常高并且部署需要花费几分钟的时间,否则您不太可能看到这种情况。您需要警惕返回 404,因为有时错误的样式表比没有样式表好。