ASP.NET:合法架构/ HttpModule关注?

时间:2009-11-18 00:07:45

标签: asp.net performance iis architecture httpmodule

我工作的一位架构师最近阅读了Yahoo!'s Exceptional Performance Best Practices指南,其中说明了将远期的Expires标头用于JavaScript,CSS和图像等页面所使用的资源。我们的想法是你为这些资源设置一个Expires标头,这样它们总是被浏览器缓存,每当我们更改文件并因此需要浏览器再次请求资源而不是使用其缓存时,请更改文件名通过添加版本号。

不过将其纳入我们的构建过程,他有另一个想法。对于每个构建(授予,这将是乏味的),不是在源和服务器磁盘上更改文件名,我们将伪造它。他的计划是在所述资源上设置远期到期,然后实现两个HttpModules。

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

有意义吗?

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

我知道HttpModules被挂钩到IIS管道中,但是这需要在IIS发送HTTP响应所花费的时间内增加一个令人望而却步的延迟。没有?你觉得怎么样?

3 个答案:

答案 0 :(得分:1)

要注意的一些事项:

  1. 如果想要将查询字符串添加到静态文件名以指示其版本,遗憾的是,这也会阻止内核模式HTTP驱动程序(http.sys)的缓存
  2. 根据一堆正则表达式扫描每个完整的响应将是缓慢,缓慢,缓慢的。它也可能是不可靠的,有难以预测的角落案例。
  3. 一些替代方案:

    1. 使用控件适配器显式替换当前版本的某些URL或路径。这使您可以专注于图像,CSS等。
    2. 在对静态文件进行版本化时更改文件夹名称而不是文件名
    3. 考虑使用ASP.NET外观来帮助集中文件名。这将有助于简化维护。
    4. 如果它有用,我会在我的书(Ultra-Fast ASP.NET)中介绍这个主题,包括代码示例。

答案 1 :(得分:0)

他担心没有缓存在客户端上的东西 - 显然这在某种程度上取决于用户群如何配置他们的浏览器;如果它是默认配置,那么我怀疑你需要担心尝试再次猜测客户端缓存,它太难了,结果不能保证,也不会帮助新用户。

就HTTP模块而言 - 原则上我会说它们很好,但是如果你采取这种方式,你会希望它们能够快速有效地运行;它可能值得一试。我不能谈论使用RegEx做你想做的事情的适当性。

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

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

如果您通过say images.foo.net调用图像,则可以立即获得6个新连接。 我们的想法是将不同的内容类型分成不同的主机名(css.foo.net,scripts.foo.net,ajaxcalls.foo.net),这样您就可以确保浏览器真正代表您的工作。

答案 2 :(得分:0)

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

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

你没有完全获得内核模式缓存速度,但是从HttpRuntime.Cache提供服务有其优势。内核模式缓存无法缓存部分响应,并且您没有对缓存进行细粒度控制。实现最重要的是一致的etag标头和过期标头。这将提高您的网站性能。

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

内存便宜,硬盘速度慢,所以请使用它!

相关问题