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>
"唯有高屋建瓴,方可水到渠成"