.NET TIPS HTTP圧縮を使用してWebページを取得するには?[2.0のみ、C#、VB]デジタルアドバンテージ 一色 政彦2006/11/03 |
|
|
「TIPS:WebRequest/WebResponseクラスでWebページを取得するには?」では、(HTTPプロトコルのGETメソッドにより)Webサーバ上のページやファイルなどをダウンロードする方法を紹介している。しかしながら実はこのTIPSが示すような.NET Framework 1.xベースの方法では、HTTP圧縮されたファイルをダウンロードすることができなかった(HTTP圧縮が行われずに通常のファイルのままダウンロードが行われる)。
本稿で解説する.NETのHTTP圧縮ではHTTP圧縮とは(※2014/07/22修正)、HTTP 1.1プロトコルの機能で、GZIPファイル・フォーマット(DEFLATE圧縮アルゴリズム)により通信データを圧縮する。これを利用することで転送量を平均で30〜50%程度に縮小できる。従って、特にネットワーク帯域幅が狭い環境で利用すると、パフォーマンスが飛躍的に向上するというメリットがある。
.NET Framework 2.0では、HttpWebRequestクラス(System.Net名前空間)が拡張され、このHTTP圧縮に対応している。具体的には次のプロパティが追加された。
AutomaticDecompressionプロパティ
このプロパティに対し、解凍方式としてDecompressionMethods列挙体(System.Net名前空間)の値を指定すれば、あとは自動的にHTTP圧縮されたファイルを解凍しながらダウンロードしてくれる(既定値は圧縮をしないDecompressionMethods.None)。
DecompressionMethods列挙体とHTTPヘッダの関係
DecompressionMethods列挙体にはいくつかの値が用意されているが、例えばAutomaticDecompressionプロパティに「DecompressionMethods.GZip」を設定すると、HTTPリクエスト・ヘッダに「Accept-Encoding: gzip」が設定されてWebサーバに送信される。その応答であるHTTPレスポンス・ヘッダに「Content-Encoding: gzip」のように「gzip」という値が格納されていれば、HTTP圧縮を利用したデータの通信を実行するという仕組みになっている(※格納されていなければ通常の通信を行う)。
DecompressionMethods列挙体およびHTTPヘッダに設定される値とその意味について、次の表にまとめた。
値 | HTTPヘッダ | 説明 | |||
GZip | gzip | GZIPファイル・フォーマット(DEFLATE圧縮アルゴリズム)による圧縮を行う | |||
Deflate | deflate | DEFLATE圧縮アルゴリズム(GZIPファイル・フォーマット)による圧縮を行う。※つまり圧縮内容はGZipと同じ | |||
None | 圧縮しない | ||||
DecompressionMethods列挙体の値 | |||||
DecompressionMethods.GZipとDecompressionMethods.Deflateは、論理和(Or)により両方を一緒に指定することもできる。例えば次のようなコードになる。
|
ここで重要なことは、AutomaticDecompressionプロパティの値を、WebサーバのHTTP圧縮の設定内容に合わせることである。通常は「DecompressionMethods.GZip」を設定すれば大丈夫な場合が多いだろう。
【コラム】GZIPとDEFLATEの違い しかし、GZIPファイル・フォーマットの仕様(RFC 1952)によると、基本的な圧縮アルゴリズムは確かに「DEFLATE」なのだが、その圧縮アルゴリズムをほかの圧縮メソッドに容易に切り替えられる仕様になっているということだ(ただしAutomaticDecompressionプロパティ経由でそのような圧縮メソッドの切り替えを実現するのは困難だと思われる)。ちなみに、DEFLATE圧縮アルゴリズムは「RFC 1951」で定義されている。 |
【コラム】Windows ServerのIISでのHTTP圧縮の設定 注意してほしいのは、HTTP圧縮が設定できるのは、サーバ版Windows OS(Windows Server 2003/2000 Server/NT Server 4.0)向けのIISだけということだ(詳しくは「Windows TIPS:Professional版に付属するIISの制限」をご覧いただきたい)。つまりWindows XPなどのクライアントOSに付属のIISではHTTP圧縮機能を検証できない。 |
それでは、AutomaticDecompressionプロパティを利用してHTTP圧縮されたファイルをダウンロードするためのサンプル・プログラムを作成してみよう。
HTTP圧縮されたファイルのダウンロードを行うサンプル・プログラム
このプログラムのAutomaticDecompressionプロパティの設定以外は、「TIPS:WebRequest/WebResponseクラスでWebページを取得するには?」とほぼ同じなので、プログラム内容の詳細はそちらのTIPSをご参照いただきたい。
|
||
HTTP圧縮されたファイルのダウンロードを行うサンプル・プログラム(上:C#、下:VB) | ||
本サンプル・プログラム実行の前提条件として、「http://server01」のWebサーバで.htmlファイルなどの静的ファイル全体に対してHTTP圧縮の設定を行っていること。 |
WebサーバのHTTP圧縮の設定を切り替えて、このサンプル・プログラムを実行してみると、サンプル・プログラムの最後に出力している「ダウンロードしたファイルのサイズ」(=HTTPヘッダの“Content-Length”)の値が変化することを確認できるだろう。筆者の環境で試したところ、「5263」のサイズのファイルが、HTTP圧縮を行うと「1932」(約37%)になった。
利用可能バージョン:.NET Framework 2.0のみ カテゴリ:クラス・ライブラリ 処理対象:ネットワーク 使用ライブラリ:HttpWebRequestクラス(System.Net名前空間) 使用ライブラリ:DecompressionMethods列挙体(System.Net名前空間) 使用ライブラリ:GZipStreamクラス(System.IO.Compression名前空間) 使用ライブラリ:DeflateStreamクラス(System.IO.Compression名前空間) |
|
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|