圧縮つき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で違ったりするのかも。