使用httpModule手动启用压缩

时间:2012-01-07 00:02:31

标签: asp.net .net

我正在尝试在我们的工作内联网上的网站上启用gzip压缩。不幸的是,我无权访问IIS,因此我所做的任何更改都是通过web.config。

服务器正在运行IIS 6和.NET 2.0。

我通过添加httpmodule

启用了压缩
public class EnableCompression : IHttpModule
{
    public void Init(HttpApplication application)
    {
        application.BeginRequest += 
            (new EventHandler(this.Application_BeginRequest));

    }

    private void Application_BeginRequest(Object source, EventArgs e)
    {
        HttpContext context = HttpContext.Current;
        context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
        HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip");
        HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true;
    }

}

我在web.config中注册了

<system.web>
    <httpModules>
      <add name="EnableCompression" type="EnableCompression"/>
    </httpModules>
</system.web>

嗯,以上工作正常,但javascript和css文件不会被压缩。根据我的发现,我必须将.js和.css添加到IIS 6中的应用程序映射中,但当然我不能这样做。

显然这可以通过web.config文件完成,但我不知道该怎么做。

如何为.js和.css文件启用压缩?

2 个答案:

答案 0 :(得分:1)

在IIS6中,托管HttpModules不处理静态代码;它需要一个原生的ISAPI。

您可以使用的一个技巧是将* .js和* .css文件转换为动态文件。您可以将它们更改为* .aspx,并将ContentType设置为正确的MIME类型。例如:

this.Response.ContentType = "application/x-javascript";

唯一的另一个技巧是在标记文件的Page指令中设置StyleSheetTheme=""。否则,运行时将坚持文档中的<head>部分。您可以启用输出缓存以最小化性能影响。

我在JS方面撰写了一篇关于此内容的博客文章,如果它有帮助(CSS类似,只是使用不同的MIME类型):http://www.12titans.net/p/dynamic-javascript.aspx

不幸的是,这需要在您的应用中更改JS和CSS文件的名称,但如果您想要压缩并且无法访问IIS,我认为没有办法解决这个问题。

如果要保留* .js和* .css扩展名,可以通过在web.config中为它们添加处理程序来实现。例如:

<compilation>
  <buildProviders>
    <add extension=".css" type="System.Web.Compilation.PageBuildProvider"/>
  </buildProviders>
</compilation>

<httpHandlers>
  <add path="*.css" verb="*" type="System.Web.UI.PageHandlerFactory"
       validate="true"/>
</httpHandlers>

这从命名角度来看有所帮助,但不是性能;这些文件仍然是动态的 - 它们基本上是* .aspx文件,但具有不同的扩展名。它也无法与ASP.NET主题一起正常工作,因为Themes文件夹中的页面不能是动态的,无论它们的扩展名如何。

答案 1 :(得分:0)

添加到@ RickNZ的答案:

小心转换为动态。 IIS在提供静态文件方面要比动态(内核模式)快得多。只考虑您的应用是否受到带宽问题的支配。

另一个选择是查看CDN的静态内容(内容传送网络)。 Azure,亚马逊,Akamai和其他公司提供服务。这是一种非常快速的地理位置友好的服务静态文件的方式。