ASP.NET 应用程序中的浏览器缓存

Posted

技术标签:

【中文标题】ASP.NET 应用程序中的浏览器缓存【英文标题】:Browser Caching in ASP.NET application 【发布时间】:2010-10-31 15:29:07 【问题描述】:

关于如何在 asp.net 应用程序中进行浏览器缓存的任何建议。我在网上找到了一些不同的方法,但不确定哪种方法最好。具体来说,我想缓存我的 CSS 和 JS 文件。它们确实会发生变化,但是,通常最多每月一次。

【问题讨论】:

看到这个问题:***.com/questions/914027/… 【参考方案1】:

另一种技术是将静态图像、css 和 js 存储在正确设置了 Expires 标头的另一台服务器上(例如 CDN)。这样做的好处有两个:

    expires 标头将鼓励浏览器和代理缓存这些静态文件 CDN 将从提供静态文件的服务器上卸载。 通过为您的静态内容使用另一个域名,浏览器的下载速度会更快。这是因为serving resources from four or five different hostnames increases parallelization of downloads。 如果 CDN 配置正确并使用 cookieless domain,那么您就没有不必要的 cookie 来回传输。

【讨论】:

【参考方案2】:

值得记住的是,即使没有 Cache-Control 或 Expires 标头,大多数浏览器也会缓存 JS 和 CSS 等内容。但是应该发生的是浏览器应该在每次需要时请求资源,但通常会得到“304 Unmodified”响应,然后浏览器使用缓存的项目。这仍然可能非常昂贵,因为它往返于服务器,但资源本身并未发送,因此传输的字节数是有限的。

IE 没有关于缓存的具体说明,默认情况下,它会使用自己的启发式方法来确定它是否应该重新请求其缓存的项目。尽管没有明确告知它可以缓存资源。它的启发式是基于资源的最后修改日期,它越旧,它现在改变的可能性就越小,这是它的典型推理。很毛茸茸的。

坦率地说,如果您想使网站表现出色,您需要控制此类缓存设置。如果您无权访问这些设置,则不必担心性能。只需通知赞助商,它可能表现不佳,因为他们没有促成一个可以让您实现这一目标的平台。

【讨论】:

【参考方案3】:

最好的办法是在 IIS 中为要缓存内容的文件夹设置 Expires 标头。这将告诉大多数现代浏览器和代理缓存此静态内容。在 IIS 6 中:

    右键单击要被浏览器缓存的文件夹(例如 CSS 或 JS)。 点击属性 转到 HTTP 标头选项卡 选中“启用内容过期” 设置较长的过期时间,例如“90 天后过期”

雅虎开发者博客talks about this technique.

【讨论】:

我无权访问 IIS。我想我正在寻找的是一种通过代码实现它的好方法。 如果 ASP.NET 提供 CSS 和 JS 文件,您可以自己在代码中执行相同的技术... Response.Cache.SetExpires(DateTime.Now.AddYears(1));跨度> ASP.NET 默认不会提供 !ASP.NET 资源,但他基本上需要再次访问 IIS【参考方案4】:

除非您将 IIS 配置为让 asp.net 控制 js/css/image 请求,否则默认情况下不会看到它们,因此您最好的计划(为了长期可维护性)是故意调整防火墙上的响应标头/ trafficmanager/server (更好,世界上大多数人在这一点上所做的)来版本你的文件在路径中,即:

不要在你的标记中写这个:

http://www.foo.com/cachingmakesmesad.css

使用这个:

http://www.foo.com/cachingmakesmesad.css?v1

..并在需要有效清除缓存时更改版本号。如果每次都是这样,那么您甚至可以附加一个 GUID 或日期戳,但我想不出我真的想在任何场合这样做。


我认为你的问题是反缓存但重新阅读它我发现我在那里浪费了一个很好的答案:P

长话短说,浏览器通常非常积极地支持缓存“简单”资源,因此您不必担心这一点,但如果您确实想对此做点什么,则必须访问防火墙/出于上述原因,trafficmanager/IIS(默认情况下不会给 ASP.NET 机会)。

但是... 你不可能绝对强制缓存,你也不应该这样做。什么是缓存什么不缓存是最终用户的决定,你所能做的就是强烈请求。

【讨论】:

【参考方案5】:

在 .net 中,您可以将 javascript、CSS 和图像设置为嵌入式资源。 .Net 将为您处理文件到期。 这种方法的缺点是您必须为每组更改进行新的构建(这可能是一个优点,具体取决于您的部署和工作流程)。

您也可以使用 ETag,但据我了解,在某些情况下,如果您混合使用 IIS and apache Webservers hosting your images(或者如果您打算在未来切换),它就不能很好地工作。

您可以确保文件日期较新,让服务器为您处理,但您必须确保服务器配置正确。

【讨论】:

【参考方案6】:

您可以通过在 web.config 中添加以下代码来缓存静态内容

 <system.webServer>
    <staticContent>
      <clientCache httpExpires="Tue, 12 Apr 2016 00:00:00 GMT" cacheControlMode="UseExpires" />
    </staticContent>
</system.webServer>

有关详细信息,请参阅clientCache documentation。

【讨论】:

以上是关于ASP.NET 应用程序中的浏览器缓存的主要内容,如果未能解决你的问题,请参考以下文章

谈谈ASP.NET Core中的ResponseCaching

.net带有参数的页面怎么进行缓存,缓存后可浏览正确页面

我的 ASP.NET 缓存是不是存储在服务器或浏览器上

Asp.Net WEb中怎么清空缓存?

如何禁用 ASP.NET 网站的所有的 浏览器缓存 ?

强制客户端浏览器重新下载我们的 asp.net Web 应用程序的 .css 和 .js 文件的优雅方式(不完全禁用缓存)