2009-11-18 46 views
2

我的作品中的建筑师最近阅读Yahoo!'s Exceptional Performance Best Practices指南,它指出对于JavaScript,CSS和图像等页面使用的资源使用远期Expires标题。这个想法是你为未来的这些资源设置一个Expires头文件,这样它们总是被浏览器缓存,当我们改变文件并因此需要浏览器再次请求资源而不是使用它的缓存时,改变文件名通过添加一个版本号。ASP.NET:合法的体系结构/ HttpModule的担忧?

虽然没有将它融入到我们的构建过程中,但他有另一个想法。我们会伪造它,而不是在每个版本中更改源文件和服务器磁盘上的文件名(授予,这将是单调乏味的),我们将伪造它。他的计划是在所述资源上设置远期到期,然后实施两个HttpModules。

一个模块会在我们的ASPX和HTML页面出来之前拦截所有的Response流,查找资源链接,并查找作为文件上次修改日期的版本参数。另一个HttpModule将处理所有资源请求,并简单地忽略该地址的版本部分。这样,浏览器每次在磁盘上更改时都会请求一个新的资源文件,而不必实际更改磁盘上文件的名称。

有意义吗?

我的问题涉及到重写ASPX/HTML页面响应流的模块。他只是在<script><img>标记的“src”属性以及<link>标记的“href”属性上应用一堆Regex.Replace()。对于内容类型为“text/html”的服务器上的每个请求都会发生这种情况。可能每分钟数百或数千。

据我所知,HttpModules挂钩到IIS管道中,但是这需要在IIS发送HTTP响应所需的时间内增加一个令人望而窒息的延迟。没有?你怎么看?

+0

我认为如果你在构建过程中这样做(实际上发布过程会更好),算法将是相同的,唯一的区别是你只执行一次操作,而不是每次请求。 – 2009-11-18 00:12:10

回答

0

他担心没有在客户端缓存的东西 - 显然这取决于用户群如何配置浏览器;如果它是默认配置,那么我怀疑你需要担心尝试第二次猜测客户端缓存,这太难了,结果也不能保证,也不会帮助新用户。就HTTP模块而言 - 原则上我会说它们很好,但是如果你走这条轨道,你会希望它们变得快速而高效;这可能值得尝试。不过,我不能说使用RegEx来做你想做的事情的恰当性。

如果你正在寻找高性能,我建议你(或你的建筑师)做一些阅读(我不认为这是一个讨厌的方式)。我最近学到了一些我认为会有所帮助的东西 - 我可以解释一下(也许你们已经知道了)。

浏览器在同一时间仅保持有限数量的同时连接对特定主机名开放。例如,IE6只会做6个连接来说明www.foo.net。

如果你从images.foo.net中调用你的图片,你会马上得到6个新的连接。 这个想法是把不同的内容类型分离成不同的主机名(css.foo.net,scripts.foo.net,ajaxcalls.foo.net),这样你就可以确保浏览器真正代表你的工作。

+0

不同的主机名技巧也在同一个雅虎的卓越性能最佳实践指南中找到,原来的海报链接,fyi! – Funka 2009-11-18 04:40:58

1

有几件事情需要注意的:

  1. 如果这个想法是添加一个查询字符串到静态文件名来表示他们的版本,遗憾的是,也将阻止缓存内核模式HTTP驱动程序(http.sys)
  2. 基于一堆正则表达式扫描每个整个响应将会慢,慢,慢。这也可能是不可靠的,与难以预测的角落案件。

几个备选方案:

  1. 使用控制适配器,以明确当前版本替换某些URL或路径。这允许您专注于图像,CSS等。
  2. 当您使用静态文件版本时更改文件夹名称而不是文件名称
  3. 考虑使用ASP.NET皮肤来帮助集中文件名。这将有助于简化维护。

如果有帮助,我会在我的书(Ultra-Fast ASP.NET)中介绍这个主题,包括代码示例。

0

http://code.google.com/p/talifun-web

StaticFileHandler - 在一个可缓存的,可恢复的方式提供静态文件。 CrusherModule - 以可缓存的方式提供压缩的版本JS和CSS。

你不完全获得内核模式缓存速度,但从HttpRuntime.Cache服务有其优点。内核模式缓存无法缓存部分响应,并且您没有对缓存进行细粒度控制。实现最重要的是一致的etag头和expires头。这比其他任何事情都会改善您的网站性能。

减少提供的文件数可能是提高网站速度的最佳方法之一。 CrusherModule将您网站上的所有CSS组合到一个文件中,并将所有js合并到另一个文件中。

内存很便宜,硬盘很慢,所以使用它!