GzipModule 实现

/// <summary>
/// 能支持双向GZIP压缩的Module,它会根据客户端是否启用GZIP来自动处理。
/// 对于服务来说,不用关心GZIP处理,服务只要处理输入输出就可以了。
/// </summary>
internal class DuplexGzipModule : IHttpModule
{
    public void Init(HttpApplication app)
    {
        app.BeginRequest += new EventHandler(app_BeginRequest);
    }

    void app_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication app = (HttpApplication)sender;

        // 注意:这里不能使用"Accept-Encoding"这个头,二者的意义完全不同。
        if( app.Request.Headers["Content-Encoding"] == "gzip" ) {
            app.Request.Filter = new GZipStream(app.Request.Filter, CompressionMode.Decompress);

            app.Response.Filter = new GZipStream(app.Response.Filter, CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "gzip");
        }
    }

    public void Dispose()
    {
    }
}

每个HttpModule只需要实现IHttpModule接口就可以了。IHttpModule也是个简单的接口:

public interface IHttpModule
{
    void Dispose();

    void Init(HttpApplication app);
}

让HttpModule工作也需要在web.config中注册:

<httpModules>
    <add name="DuplexGzipModule" type="MySimpleServiceFramework.DuplexGzipModule"/>
</httpModules>

 

 

posted @ 2013-04-18 10:35  microsoftzhcn  阅读(179)  评论(0编辑  收藏  举报