基于DLL更改在.NET项目中实现缓存清除的最佳方法是什么?

时间:2015-07-21 16:35:12

标签: c# asp.net .net asp.net-mvc

我希望通过在链接/脚本标记src的末尾添加?v=number,基于.NET项目中的代码更改(对DLL的更改)为我们的JavaScript和CSS实现缓存清除路径。我想以最高效的方式执行此操作,因为这将在应用程序的每个页面上使用。只需获取DLL版本就是生成该数字的最佳方式,如here所解释的那样?

1 个答案:

答案 0 :(得分:3)

缓存是计算机科学中最难的问题之一。适合所有问题没有神奇的答案,因为缓存是一种优化技术:您需要权衡以获得您感兴趣的性能配置文件。只有您知道什么是“最佳”的问题。

对于HTTP,有一系列标题向客户端指示它们应如何执行缓存。与所有标题一样,客户可以选择忽略它们并做自己的事情,但是你应该感到很舒服,大多数客户会注意你发回的内容。

此讨论的相关标题是:

  • cache-control
  • etag

缓存控制

此标头向客户端返回应该应用的基本缓存规则。如果未指定此标头,则客户端可以自行选择有关缓存的操作。如果您没有发送此标题,则无法对客户的行为做出许多假设。

cache-control标头由许多指令组成,用于指示要应用于资源的缓存规则。常见的是:

  • private | public - private指令表明代理服务器不应该缓存此值;缓存的责任完全在于客户。 public指令表示代理服务器可以缓存此资源。如果您正在为最终用户定制的资源(例如在页面上某处具有用户名),则private指令是合适的。如果您提供的是所有用户共享的资源,public是合适的(例如图标或徽标)。
  • max-age这表示在客户端返回另一个副本之前应该缓存资源的秒数,而不管其他任何缓存策略。这是资源保留在客户端缓存中的最长时间。
  • no-cache这告诉客户不要每次都缓存资源并检查新版本。这并不意味着客户端根本不缓存资源,而是每次发出请求时它都会检查资源是否已更改。 etag标题将与此相关。
  • no-store这表示客户端根本不应存储响应。

表示动态资源(每个请求都会更改的资源)的cache-control值为:

cache-control: no-cache

这告诉客户端和任何代理服务器每次发出请求时都应检查此资源。

将资源缓存1天的cache-control标头如下所示:

`cache-control: public, max-age=86400

ETAG

etag标头是实体标签的缩写。您可以将etag标头视为资源的哈希码。当您提供此标头时,您可以为客户端提供一种方法来确定资源是否已更改,而无需检索整个资源。

当客户端的资源值为etag时,它可以向服务器发出请求,就像“如果etag值与我的etag值不同,请给我这个资源”。 。您仍然需要进行网络往返的费用,但是如果值已更改,您的客户端将只接收新资源。

etag标头在节省带宽方面最有用。如果您使用的是etag,则客户端只会在实际更改时下载新版本,否则将无限期地缓存该值。与重新下载完整资源相比,客户端所做的请求非常小且完整得快。

cache-controlcache-control合并后,etag标头决定本地缓存值何时不再有效,etag用于后续请求看资源是否已经改变。

根据您使用的框架和库,有许多方法可以控制这些标头值,但您需要对要设置它们的内容做出明智的猜测。

我建议你可以便宜地制作一个,将etag应用于响应是一种简单的方法来实现你所要求的分解。您通常应该将cache-controlmax-age标头合并,该标头包含{{1}}值,该值适用于您在更改值时需要客户端“响应”的程度。

最后请注意,不要忘记缓存是一种优化。如果缓存成本不值得付出,你可以将其关闭。