65.9K
CodeProject 正在变化。 阅读更多。
Home

HTTP 压缩在 .NET Framework 2.0 中

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (18投票s)

2006年1月13日

2分钟阅读

viewsIcon

242895

downloadIcon

1694

一篇关于如何在 .NET Framework 2.0 中请求和处理 HTTP 压缩的文章。

引言

本文介绍了如何实现一个实用类,该类可以允许 HTTP 请求告知服务器(或客户端和服务器之间的任何网络设备)它可以处理的压缩类型,并在不更改客户端应用程序的情况下解压缩服务器的响应(如果有)。

当连接成本很高时,HTTP 压缩非常有益。

创建 WebRequest 实例的工厂模式

WebRequest 提供了两种创建实例的方法

WebRequest 类使用实现了 IWebRequestCreate 接口的类的实例,并且这些类在配置文件中的 webRequestModules 部分进行了注册。Create 方法(由 CreateDefaultCreate 调用)返回一个已初始化的 WebRequest 派生类的实例,该类能够执行标准的请求/响应事务,而无需修改任何特定于协议的字段。

另一方面,之前创建的 WebRequest 派生实例将返回 WebResponse 派生实例,这些实例将处理 HTTP 响应。

由于工厂模式的实现方式,我们可以更改已构建应用程序(我们的应用程序甚至 .NET Framework)的行为,以请求和处理 HTTP 压缩,只需更改配置文件即可。

由于 .NET Framework 的 2.0 及更高版本已经支持压缩,因此无需提供 WebRequestWebResponse 派生类实现。所有需要的是一个实现 IWebRequestCreate 接口的类来创建 WebRequest派生实例并对其进行设置。

代码

如前所示,要为我们的应用程序添加 HTTP 压缩支持,我们只需要构建三个类

CompressibleHttpRequestCreator

为了使使用 HttpWebRequestHttpWebResponse 的应用程序能够正常工作而无需进行任何更改,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 移植过来时,我完全忽略了 HttpWebRequestHttpWebResponse 已经实现了压缩的事实。

感谢 Björn 指出这一点。

© . All rights reserved.