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

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

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

最佳答案

缓存是计算机科学中最困难的问题之一。解决所有问题没有万能的答案,因为缓存是一种优化技术:您需要进行权衡以实现您感兴趣的性能概况。只有您知道什么才是最适合您的问题。

对于HTTP,有一系列标头向客户端指示客户端应如何执行缓存。与所有标头一样,客户端可以选择忽略它们并执行自己的操作,但是您应该放心,大多数客户端会注意您发回的邮件。

此讨论的相关标题为:


cache-control
etag




缓存控制

此标头向客户端指示他们应应用哪些基本缓存规则。如果未指定此标头,则客户端可以自行选择要进行缓存的方式。如果您不发送此标头,则不能对客户的行为做出许多假设。

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


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


表示动态资源(随每个请求而变化的资源)的cache-control值是:

cache-control: no-cache


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

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

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




标签

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

当客户端的资源具有etag值时,它可以向服务器发出请求,就像“如果其etag值与我拥有的资源不同”,请给我该资源。您仍然要付出代价网络往返,但是如果值更改,您的客户端将仅接收新资源。

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

当将etagcache-control结合使用时,cache-control标头决定何时本地缓存的值不再有效,并且在后续请求中使用etag来查看资源是否已更改。



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

我建议,在可以廉价生产的地方,对响应应用etag是实现所要求的缓存的一种简单方法。通常,您应该将etagcache-control标头结合使用,该标头包含一个max-age值,该值适合于更改值时您的客户端需要如何“响应”。

最后一点,不要忘记缓存是一种优化。您可以将其关闭,如果缓存的成本不值得回报,则应该关闭它。

关于c# - 在基于DLL更改的.NET项目中实现缓存清除的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31544791/

相关文章:

c# - explain x => x.ToString()//简化这么多调用

c# - MongoDB 在正则表达式查询中使用索引

c# - 将 SslStream 与 IOCP 结合使用

c# - System.Threading.Task 不工作

asp.net - 自定义404不显示

.net - 堆栈跟踪中的行号错误(发布)

c# - 检查对象是否为 null 并在同一个 if 语句中比较对象的属性值是否安全?

c# - 发送多封邮件——大型系统中使用的解决方案

.net - 存储过程级别的 SQL 事务和 SqlConnection 级别的 SQL 事务有什么区别?

ASP.NET MVC 5 与 AngularJS/ASP.NET WebAPI