压缩你的 ASP.NET 2.0 页面






4.11/5 (3投票s)
一篇关于如何压缩 ASP.NET 页面的输出流的文章。

引言
如果你的网站稍微成功一点,你很快就能感受到钱包的压力。 带宽通常是网站价格的一个成本因素。 可以通过一些压缩标准来限制带宽。 当我找到 Ben Lowery 的模块时,我正在寻找一种压缩我的 ASP.NET 页面的方法,该模块可以在 这里找到。 但他的实现从未正常工作,至少在我的情况下,在 .NET 1.1 和 .NET 2.0 中都是如此。
我下载了他的代码并阅读了它,它完全是 .NET 1.1 风格,并且仍然像在使用 #ziplib 一样编写。 因此,我重写了他的版本,使其能够正常工作,并且能够正确检测路径。 在我的例子中,每当我尝试使用他的库时,页面的输出都是空的。
使用代码
使用代码非常简单。 编译 HttpCompress 模块后,你可以将其引用添加到任何 .NET 2.0 站点。 接下来,你应该在 web.config 中设置一些参数,然后就可以开始了。 如果你想查看内容是否真的被过滤,你需要一些记录 HTTP 管道的东西。 我使用 Nikhil Kothari 的 WebDevHelper BHO 来执行此操作。 另一种选择是使用 Fiddler。
首先可以配置的是要从压缩中排除的路径和 mime 类型。 例如,我不压缩任何图像,也不压缩流式视频等,因为这些格式已经压缩得很好,压缩它们不会带来任何明显的收益。 你更有可能以很小的收益消耗更多的服务器资源。
<configuration>
  <configSections>
    <sectionGroup name="Flanders">
      <section name="HttpCompress" 
        type="Flanders.Library.Modules.HttpCompress.
                 Configuration, HttpCompress"/>
    </sectionGroup>
  </configSections>
  <Flanders>
    <HttpCompress compressionType="GZip">
      <ExcludedPaths>
        <add path="NoCompression.aspx"/>
      </ExcludedPaths>
      <ExcludedMimeTypes>
        <add mime="image/jpeg"/>
      </ExcludedMimeTypes>
    </HttpCompress>
  </Flanders>
  <system.web>
    <httpModules>
      <add name="HttpCompressModule" 
        type="Flanders.Library.Modules.HttpCompress.
                HttpModule,HttpCompress"/>
    </httpModules>
  </system.web>
</configuration>
在模块中,你需要将一个事件挂接到 PostReleaseRequeststate。 以前,我将其挂接到 BeginRequest 事件,但这个事件执行得太早了,模块无法执行。 在 PostReleaseRequestState,整个页面已经执行完毕,并且其响应内容已经生成。
   41         public void Init(HttpApplication context)
   42         {
   43             context.PostReleaseRequestState+=
                       new EventHandler(context_PostReleaseRequestState);
   44         }
历史
- 2006年7月1日:v.1.0 - 将内容添加到 CodeProject 并撰写本文。
- 2006年1月23日:v.1.1 - 由于 JavaScript 处理问题以及更多问题而重构了模块 ;-)。


