Click here to Skip to main content
11,505,486 members (57,677 online)
Click here to Skip to main content

HTTP compression in .NET Framework 2.0

, 1 May 2007 173.5K 1.4K 71
Rate this:
Please Sign up or sign in to vote.
An article on how to request and handle HTTP compression in .NET Framework 2.0.

Introduction

This article describes the implementation of a utility class that will allow HTTP requests informing the server (or any appliance in the network between the client and the server) what types of compression it can handle and uncompress the response from the server (if any) without changing the client application.

HTTP compression is very useful when the cost of the connection is high.

The factory pattern of creating WebRequest instances

The WebRequest supplies two methods to create instances:

The WebRequest class uses instances of classes that implement the IWebRequestCreate interface and are registered in the webRequestModules section in the configuration files. The Create method (called by both CreateDefault and Create) returns an initialized instance of a WebRequest descendent class capable of performing a standard request/response transaction for the protocol without needing any protocol-specific fields modified.

On the other hand, the previously created WebRequest derived instances will return WebResponse derived instances that will handle the HTTP response.

Because of the way the factory pattern is implemented, we can change the behavior of already built applications (our applications or even the .NET Framework) to request and handle HTTP compression, changing only the configuration files.

Since in versions 2.0 and above of the .NET framework already support compression, there is no need to supply WebRequestand WebResponse derived class implementations. All that's needed is a class that implements the IWebRequestCreate interface to create the WebRequestderived instance and set it up.

The code

As shown before, to add HTTP compression to our applications, we just have to build three classes:

CompressibleHttpRequestCreator

In order for the applications that use HttpWebRequest and HttpWebResponse to work without any changes, CompressibleHttpRequestCreator.Create has to return a HttpWebRequest instance. Unfortunately, there is no public construtor for HttpWebRequest or publicly accessible implementation of IWebRequestCreate.Create that creates a HttpWebRequest instance, so some reflection will be needed.

The implementation of IWebRequestCreate.Create just creates an instance of HttpWebRequest and sets its HttpWebRequest.AutomaticDecompression to accept all types of compression.

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;
    }
}  

Configuration

Now, to add HTTP compression support to any application, all that's needed is to add the corresponding entries to the webRequestModules section in the configuration file.

<configuration>
  <system.net>
    <webRequestModules>
      <remove prefix="http:"/>
      <add prefix="http:" 
            type="Pajocomo.Net.CompressibleHttpRequestCreator, Pajocomo" />
    </webRequestModules>
  </system.net>
</configuration>

History

When I first ported this from .NET 1.1, I completely missed the fact that HttpWebRequest and HttpWebResponse already implemented compression.

Thanks to Björn to point that out to me.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Paulo Morgado
Software Developer (Senior) Paulo Morgado
Portugal Portugal

Comments and Discussions

 
QuestionCompressibleHttpRequestCreator - app.config vs programmatically (for Class Library App) Pin
Member 1095544418-Jul-14 0:33
memberMember 1095544418-Jul-14 0:33 
AnswerRe: CompressibleHttpRequestCreator - app.config vs programmatically (for Class Library App) Pin
Paulo Morgado18-Jul-14 6:19
professionalPaulo Morgado18-Jul-14 6:19 
GeneralRe: CompressibleHttpRequestCreator - app.config vs programmatically (for Class Library App) Pin
Member 1095544421-Jul-14 21:19
memberMember 1095544421-Jul-14 21:19 
GeneralRe: CompressibleHttpRequestCreator - app.config vs programmatically (for Class Library App) Pin
Paulo Morgado22-Jul-14 14:07
professionalPaulo Morgado22-Jul-14 14:07 
GeneralMy vote of 5 Pin
LastMandg423-Jan-11 3:33
memberLastMandg423-Jan-11 3:33 
GeneralYou are my hero!!!!! Pin
yoni at jefco22-Nov-10 11:13
memberyoni at jefco22-Nov-10 11:13 
GeneralRe: You are my hero!!!!! Pin
Paulo Morgado22-Nov-10 13:28
memberPaulo Morgado22-Nov-10 13:28 
GeneralRe: You are my hero!!!!! Pin
yoni at jefco23-Nov-10 4:22
memberyoni at jefco23-Nov-10 4:22 
GeneralRe: You are my hero!!!!! Pin
Paulo Morgado23-Nov-10 14:10
memberPaulo Morgado23-Nov-10 14:10 
Questionhow to use compressibles [modified] Pin
animayhem026-Aug-10 1:56
memberanimayhem026-Aug-10 1:56 
What I have to do to use Your CompressibleHttpWebRequest an CompressibleHttpWebResponse?

Usage of cerator is explained but I cant figure out how to use the others.

Im trying to combine Your solution with WsHttpBinding to decompress gzipped message.

Thanks for any help
g

modified on Thursday, August 26, 2010 8:08 AM

AnswerRe: how to use compressibles Pin
Paulo Morgado26-Aug-10 14:06
memberPaulo Morgado26-Aug-10 14:06 
GeneralRe: how to use compressibles Pin
animayhem026-Aug-10 21:06
memberanimayhem026-Aug-10 21:06 
GeneralRe: how to use compressibles Pin
Paulo Morgado29-Aug-10 2:39
memberPaulo Morgado29-Aug-10 2:39 
GeneralRe: how to use compressibles Pin
animayhem029-Aug-10 4:40
memberanimayhem029-Aug-10 4:40 
GeneralRe: how to use compressibles Pin
Paulo Morgado31-Aug-10 13:11
memberPaulo Morgado31-Aug-10 13:11 
GeneralRe: how to use compressibles Pin
animayhem031-Aug-10 19:01
memberanimayhem031-Aug-10 19:01 
GeneralF*ing brilliant Pin
Greg Olmstead17-Mar-10 7:22
memberGreg Olmstead17-Mar-10 7:22 
GeneralRe: F*ing brilliant Pin
Paulo Morgado17-Mar-10 13:45
memberPaulo Morgado17-Mar-10 13:45 
GeneralCompression not working Pin
dizzybinty29-May-09 7:45
memberdizzybinty29-May-09 7:45 
GeneralRe: Compression not working Pin
Paulo Morgado31-May-09 12:13
memberPaulo Morgado31-May-09 12:13 
GeneralMessage Automatically Removed Pin
15-Jan-09 11:13
memberDotNetGuts15-Jan-09 11:13 
GeneralRe: Good Links for Http Compression Pin
Paulo Morgado15-Jan-09 12:53
memberPaulo Morgado15-Jan-09 12:53 
GeneralRe: Using IIS7 Pin
Matt_Izilla21-Nov-07 17:39
memberMatt_Izilla21-Nov-07 17:39 
General.Net 2.0 supports content encoding out-of-the-box Pin
bwaide30-Apr-07 3:28
memberbwaide30-Apr-07 3:28 
GeneralRe: .Net 2.0 supports content encoding out-of-the-box Pin
Paulo Morgado1-May-07 10:49
memberPaulo Morgado1-May-07 10:49 
GeneralWarnings Pin
nzeemin6-Mar-07 19:51
membernzeemin6-Mar-07 19:51 
GeneralRe: Warnings Pin
Paulo Morgado6-Mar-07 22:54
memberPaulo Morgado6-Mar-07 22:54 
GeneralCompression engine that WORKS for me! Pin
pelam1-Mar-07 12:26
memberpelam1-Mar-07 12:26 
GeneralRe: Compression engine that WORKS for me! Pin
Paulo Morgado1-Mar-07 12:51
memberPaulo Morgado1-Mar-07 12:51 
QuestionContentEncoding Pin
captainq24-Oct-06 15:31
membercaptainq24-Oct-06 15:31 
AnswerRe: ContentEncoding Pin
Paulo Morgado24-Oct-06 22:19
memberPaulo Morgado24-Oct-06 22:19 
GeneralRe: ContentEncoding Pin
captainq5-Nov-06 2:55
membercaptainq5-Nov-06 2:55 
GeneralRe: ContentEncoding Pin
Paulo Morgado5-Nov-06 4:36
memberPaulo Morgado5-Nov-06 4:36 
GeneralRe: ContentEncoding Pin
captainq5-Nov-06 8:50
membercaptainq5-Nov-06 8:50 
GeneralSystem.Runtime.Serialization.dll Pin
Jntn14-May-06 7:53
memberJntn14-May-06 7:53 
GeneralRe: System.Runtime.Serialization.dll Pin
Paulo Morgado14-May-06 10:31
memberPaulo Morgado14-May-06 10:31 
GeneralRe: System.Runtime.Serialization.dll Pin
Jntn14-May-06 22:22
memberJntn14-May-06 22:22 
GeneralRe: System.Runtime.Serialization.dll Pin
Paulo Morgado14-May-06 23:39
memberPaulo Morgado14-May-06 23:39 
Generalweb service specific exception Pin
Petr Melichar22-Apr-06 2:03
memberPetr Melichar22-Apr-06 2:03 
GeneralRe: web service specific exception Pin
Paulo Morgado14-May-06 10:20
memberPaulo Morgado14-May-06 10:20 
AnswerRe: web service specific exception Pin
realmaestro3-Apr-07 15:48
memberrealmaestro3-Apr-07 15:48 
GeneralRe: web service specific exception Pin
Paulo Morgado3-Apr-07 21:59
memberPaulo Morgado3-Apr-07 21:59 
QuestionImport problem Pin
TommyB811-Mar-06 4:09
memberTommyB811-Mar-06 4:09 
AnswerRe: Import problem Pin
Paulo Morgado12-Mar-06 1:07
memberPaulo Morgado12-Mar-06 1:07 
GeneralRe: Import problem Pin
TommyB812-Mar-06 1:24
memberTommyB812-Mar-06 1:24 
GeneralRe: Import problem Pin
Paulo Morgado12-Mar-06 2:01
memberPaulo Morgado12-Mar-06 2:01 
GeneralRe: Import problem Pin
TommyB812-Mar-06 2:30
memberTommyB812-Mar-06 2:30 
GeneralRe: Import problem Pin
Paulo Morgado12-Mar-06 6:37
memberPaulo Morgado12-Mar-06 6:37 
AnswerRe: Import problem Pin
TommyB812-Mar-06 6:44
memberTommyB812-Mar-06 6:44 
QuestionHelp - How to do? Pin
RSArockiam6-Feb-06 20:44
memberRSArockiam6-Feb-06 20:44 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.150520.1 | Last Updated 1 May 2007
Article Copyright 2006 by Paulo Morgado
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid