.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)により両方を一緒に指定することもできる。例えば次のようなコードになる。
req.AutomaticDecompression =
  DecompressionMethods.GZip | DecompressionMethods.Deflate;
req.AutomaticDecompression = _
  DecompressionMethods.GZip Or DecompressionMethods.Deflate
DecompressionMethods.GZipとDecompressionMethods.Deflateの論理和(上:C#、下:VB)
「req」オブジェクトはHttpWebRequestクラスのインスタンスを表している。
このように指定した場合、HTTPヘッダ(リクエストおよびレスポンス)は「gzip, deflate」となる。

 ここで重要なことは、AutomaticDecompressionプロパティの値を、WebサーバのHTTP圧縮の設定内容に合わせることである。通常は「DecompressionMethods.GZip」を設定すれば大丈夫な場合が多いだろう。

【コラム】GZIPとDEFLATEの違い
 上記の表の中にも記載があるが、GZIPファイル・フォーマットの基本的な圧縮アルゴリズムは「DEFLATE」である。実際に、GZIP形式による圧縮はGZipStreamクラス(System.IO.Compression名前空間)を利用するが(参考:「TIPS:GZIP形式でファイルを圧縮/解凍するには?」)、このGZipStreamクラスは内部でDeflateStreamクラス(System.IO.Compression名前空間)のアルゴリズムを利用している。従って、GZIP形式で圧縮・解凍しても、DEFLATE形式で圧縮・解凍しても、同じ結果となる。

 しかし、GZIPファイル・フォーマットの仕様(RFC 1952)によると、基本的な圧縮アルゴリズムは確かに「DEFLATE」なのだが、その圧縮アルゴリズムをほかの圧縮メソッドに容易に切り替えられる仕様になっているということだ(ただしAutomaticDecompressionプロパティ経由でそのような圧縮メソッドの切り替えを実現するのは困難だと思われる)。ちなみに、DEFLATE圧縮アルゴリズムは「RFC 1951」で定義されている。

 

【コラム】Windows ServerのIISでのHTTP圧縮の設定
 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をご参照いただきたい。

using System;
using System.IO;
using System.Net;
using System.Text;

class Program
{
  static void Main(string[] args)
  {
    string url = "http://server01/test.html";

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);

    // HTTP圧縮への対応
    req.AutomaticDecompression = DecompressionMethods.GZip;

    // ファイルのダウンロード
    WebResponse res = req.GetResponse();
    Stream st = res.GetResponseStream();
    StreamReader sr = new StreamReader(st);
    string html = sr.ReadToEnd();
    Console.WriteLine(html);
    sr.Close();
    st.Close();

    // ダウンロードしたファイルのサイズ
    Console.WriteLine(res.Headers["Content-Length"]);
  }
}
Imports System.IO
Imports System.Net
Imports System.Text

Module Module1

  Sub Main()
    Dim url As String = "http://server01/test.html"

    Dim req As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)

    ' HTTP圧縮への対応
    req.AutomaticDecompression = DecompressionMethods.GZip

    ' ファイルのダウンロード
    Dim res As WebResponse = req.GetResponse()
    Dim st As Stream = res.GetResponseStream()
    Dim sr As StreamReader = New StreamReader(st)
    Dim html As String = sr.ReadToEnd()
    Console.WriteLine(html)
    sr.Close()
    st.Close()

    ' ダウンロードしたファイルのサイズ
    Console.WriteLine(res.Headers("Content-Length"))
  End Sub

End Module
HTTP圧縮されたファイルのダウンロードを行うサンプル・プログラム(上:C#、下:VB)
本サンプル・プログラム実行の前提条件として、「http://server01」のWebサーバで.htmlファイルなどの静的ファイル全体に対してHTTP圧縮の設定を行っていること。

 WebサーバのHTTP圧縮の設定を切り替えて、このサンプル・プログラムを実行してみると、サンプル・プログラムの最後に出力している「ダウンロードしたファイルのサイズ」(=HTTPヘッダの“Content-Length”)の値が変化することを確認できるだろう。筆者の環境で試したところ、「5263」のサイズのファイルが、HTTP圧縮を行うと「1932」(約37%)になった。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:クラス・ライブラリ 処理対象:ネットワーク
使用ライブラリ:HttpWebRequestクラス(System.Net名前空間)
使用ライブラリ:DecompressionMethods列挙体(System.Net名前空間)
使用ライブラリ:GZipStreamクラス(System.IO.Compression名前空間)
使用ライブラリ:DeflateStreamクラス(System.IO.Compression名前空間)

この記事と関連性の高い別の.NET TIPS
GZIP形式でファイルを圧縮/解凍するには?
[ASP.NET]動的に圧縮ファイルを生成するには?
HTTPステータス・コードを取得しWebページの存在を確認するには?
[ASP.NET]特定の拡張子に対するアクセスを制限するには?
[ASP.NET]アプリケーション共通のロギングを行うには?(HTTPモジュール編)
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間