圧縮つきWebClientクラス

WebClient クラスは2.0でかなり便利になってますね。非同期に使えるようになったんで、html を落としてファイルに保存する程度ならもうこれだけでいいね。
非同期に使う方法も .NET2.0 で新しく出てきた「イベントベースの非同期パターン」ってやつで超簡単。従来の IAsyncResult パターンはめんどくさかったけど、イベントベースのパターンは基本的には「ほにゃららAsync」メソッドを呼んで「ほにゃららCompleted」イベントで終了通知を受けるって感じでめちゃ簡単。
非同期の話はさておき、WebClient クラスをそのまま使うと Gzip 圧縮してくれないんで、ダウンロードがすごい遅い。帯域幅は大切にってことで圧縮する WebClient クラス作ってみました。Deflate圧縮ってのも対応してます(Deflateってこのクラス書くときに始めて知ったw)。
使い方は WebClient の代わりにこのクラスを使うだけ。そのほかの使い方はまったく一緒です。なにげに User-Agent 偽装してるけどw
User-Agent、Accept、Accept-Language は好きにいじってください。

using System;
using System.Net;

namespace SioKoshou
{
  public class CompressedWebClient : WebClient
  {
    protected override WebRequest GetWebRequest( Uri uri )
    {
      WebRequest webRequest = base.GetWebRequest( uri );
      HttpWebRequest httpWebRequest = webRequest as HttpWebRequest;
      if ( httpWebRequest == null ) return webRequest;

      httpWebRequest.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*";
      httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)";

      httpWebRequest.Headers[ "Accept-Language" ] = "ja,en-us;q=0.5";
      httpWebRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
      return httpWebRequest;
    }
  }
}

余談だけどIE7β入れたらGETで「UA-CPU: x86」ってのも送ってた。32bitIEと64bitIEで違ったりするのかも。