HTTP 压缩在 .NET Framework 2.0 中






4.64/5 (18投票s)
2006年1月13日
2分钟阅读

242895

1694
一篇关于如何在 .NET Framework 2.0 中请求和处理 HTTP 压缩的文章。
引言
本文介绍了如何实现一个实用类,该类可以允许 HTTP 请求告知服务器(或客户端和服务器之间的任何网络设备)它可以处理的压缩类型,并在不更改客户端应用程序的情况下解压缩服务器的响应(如果有)。
当连接成本很高时,HTTP 压缩非常有益。
创建 WebRequest 实例的工厂模式
WebRequest
提供了两种创建实例的方法
-
CreateDefault
- 为指定的 URI 方案初始化一个新的WebRequest
实例。 -
Create
- 为指定的 URI 方案初始化一个新的WebRequest
实例。
WebRequest
类使用实现了 IWebRequestCreate
接口的类的实例,并且这些类在配置文件中的 webRequestModules
部分进行了注册。Create
方法(由 CreateDefault
和 Create
调用)返回一个已初始化的 WebRequest
派生类的实例,该类能够执行标准的请求/响应事务,而无需修改任何特定于协议的字段。
另一方面,之前创建的 WebRequest
派生实例将返回 WebResponse
派生实例,这些实例将处理 HTTP 响应。
由于工厂模式的实现方式,我们可以更改已构建应用程序(我们的应用程序甚至 .NET Framework)的行为,以请求和处理 HTTP 压缩,只需更改配置文件即可。
由于 .NET Framework 的 2.0 及更高版本已经支持压缩,因此无需提供 WebRequest
和
WebResponse
派生类实现。所有需要的是一个实现 IWebRequestCreate
接口的类来创建 WebRequest
派生实例并对其进行设置。
代码
如前所示,要为我们的应用程序添加 HTTP 压缩支持,我们只需要构建三个类
CompressibleHttpRequestCreator
- 实现IWebRequestCreate
接口。
CompressibleHttpRequestCreator
为了使使用 HttpWebRequest
和 HttpWebResponse
的应用程序能够正常工作而无需进行任何更改,CompressibleHttpRequestCreator.Create
必须返回一个 HttpWebRequest
实例。不幸的是,HttpWebRequest
没有公共构造函数,也没有可公开访问的 IWebRequestCreate.Create
实现来创建 HttpWebRequest
实例,因此需要一些反射。
IWebRequestCreate.Create
的实现只是创建一个 HttpWebRequest
实例,并将其 HttpWebRequest.AutomaticDecompression
设置为接受所有类型的压缩。
public class CompressibleHttpRequestCreator : IWebRequestCreate
{
public CompressibleHttpRequestCreator()
{
}
WebRequest IWebRequestCreate.Create(Uri uri)
{
HttpWebRequest httpWebRequest =
Activator.CreateInstance(typeof(HttpWebRequest),
BindingFlags.CreateInstance | BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Instance,
null, new object[] { uri, null }, null) as HttpWebRequest;
if (httpWebRequest == null)
{
return null;
}
httpWebRequest.AutomaticDecompression =DecompressionMethods.GZip |
DecompressionMethods.Deflate;
return httpWebRequest;
}
}
配置
现在,要为任何应用程序添加 HTTP 压缩支持,只需在配置文件中的 webRequestModules
部分添加相应的条目即可。
<configuration>
<system.net>
<webRequestModules>
<remove prefix="http:"/>
<add prefix="http:"
type="Pajocomo.Net.CompressibleHttpRequestCreator, Pajocomo" />
</webRequestModules>
</system.net>
</configuration>
历史
当我第一次将此 从 .NET 1.1 移植过来时,我完全忽略了 HttpWebRequest
和 HttpWebResponse
已经实现了压缩的事实。
感谢 Björn 指出这一点。