.NET TIPS

プロキシ設定によりWebページへのアクセスを高速化するには?[2.0のみ、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2007/11/22

 .NET Frameworkでは、WebClientクラスやHttpWebRequestクラス(どちらもSystem.Net名前空間)などを使用することにより、簡単にWebページやWeb上のリソースにアクセスできるようになっている*。しかしこれらのクラスを利用したアプリケーションは、実行時に非常に時間がかかってしまう場合がある。

*TIPS:WebClientクラスでWebページを取得するには?」「TIPS:WebClientクラスでGETメソッドによりクエリ文字列を送信するには?」「TIPS:WebRequest/WebResponseクラスでWebページを取得するには?」「TIPS:WebRequest/WebResponseクラスでPOSTメソッドによりデータを送信するには?」などを参照。

 例えば次のサンプル・プログラムはInsider.NETのトップ・ページのHTMLを文字列として取得するものだが、筆者の環境では、DownloadStringメソッドの呼び出しが完了するまでに10秒以上の時間を要した(同じ環境で、Internet Explorer(以下、IE)によりWebページにアクセスした場合には瞬時にページが表示される)。

// webget.cs

using System;
using System.Net;

class WebGet {
  static void Main() {

    string url = "http://www.atmarkit.co.jp/fdotnet/index.html";
    WebClient wc = new WebClient();

    DateTime start = DateTime.Now;
    string html = wc.DownloadString(url);
    DateTime end = DateTime.Now;

    Console.WriteLine(end - start); // 出力例:00:00:14.3437500
  }
}

// コンパイル方法:csc webget.cs
HTMLを文字列として取得するC#のサンプル・プログラム(webget.cs)

' webget.vb

Imports System
Imports System.Net

Class WebGet
  Shared Sub main()

    Dim url As String = "http://www.atmarkit.co.jp/fdotnet/index.html"
    Dim wc As New WebClient()

    Dim start As DateTime = DateTime.Now
    Dim html As String = wc.DownloadString(url)
    Dim finish As DateTime = DateTime.Now

    Console.WriteLine(finish - start) ' 出力例:00:00:14.3437500
  End Sub
End Class

' コンパイル方法:vbc webget.vb
HTMLを文字列として取得するVBのサンプル・プログラム(webget.vb)

 このようにWebページへのアクセスに時間がかかってしまうたいていの原因は、クラス・ライブラリで実装されている「自動プロキシ検出」である。

 既定では、この自動プロキシ検出によりIEのプロキシ設定*が検出され、WebClientクラスやHttpWebRequestクラスはそれを利用してWebにアクセスする。この仕組みにより、アプリケーションではプロキシ設定機能の実装を省くことができるわけだ。

* IEのプロキシ設定は[ツール]メニューの[インターネット オプション]により[インターネット オプション]ダイアログを開き、[接続]タブ上にある[LANの設定]ボタンをクリックすることにより設定できる。

 しかしプロキシ検出の処理は、前述したように非常に時間がかかる。もしインターネットに直接アクセスできる環境であれば、クラス・ライブラリがプロキシを使用しないように設定することで、WebClientクラスやHttpWebRequestクラスによるアクセスを高速化できる。

プロキシを使用せずにWebページにアクセスするには?

 アプリケーションでプロキシを使用しないようにするには、次のような.configファイルを実行ファイルと同じフォルダに作成すればよい。アプリケーションの実行ファイル名が例えば「webget.exe」の場合には、このファイルは「webget.exe.config」という名前で作成する。

<configuration >
  <system.net>
    <defaultProxy>
      <proxy usesystemdefault="false" />
    </defaultProxy>
  </system.net>
</configuration>
プロキシを使用しないようにする.configファイルの設定

 この.configファイルでは、<proxy>要素により、システムに既定のプロキシを使用しないように設定している。<proxy>要素では特定のプロキシ・サーバを指定することも可能だ。詳細に関しては、MSDNの<proxy>要素の項を参照してほしい。

 ちなみに、この設定を行うことにより、筆者の環境では冒頭のサンプル・プログラムの実行時間は1秒前後となった。

 また、コードによりプロキシを使用しないようにすることも可能である。この場合には、WebClientクラスやHttpWebRequestクラスのオブジェクトのProxyプロパティにnull(VBではNothing)を設定すればよい。

WebClient wc = new WebClient();
wc.Proxy = null;
string html = wc.DownloadString(url);
……
Dim wc As New WebClient()
wc.Proxy = Nothing
Dim html As String = wc.DownloadString(url)
……
WebClientクラスでプロキシを使用しないようにしたコード例(上:C#、下:VB)

 あるいは、あらかじめWebRequestクラス(System.NET名前空間)の静的プロパティであるDefaultWebProxyプロパティをnull/Nothingに設定してもよい。

WebRequest.DefaultWebProxy = null;

WebClient wc = new WebClient();
string html = wc.DownloadString(url);
……
WebRequest.DefaultWebProxy = Nothing

Dim wc As New WebClient()
Dim html As String = wc.DownloadString(url)
……
WebRequestクラスでプロキシを使用しないようにしたコード例(上:C#、下:VB)

 この場合には、アプリケーション全体でプロキシが使用されなくなる。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:クラス・ライブラリ 処理対象:ネットワーク
使用ライブラリ:WebClientクラス(System.Net名前空間)
使用ライブラリ:HttpWebRequestクラス(System.Net名前空間)
使用ライブラリ:WebRequestクラス(System.NET名前空間)
関連TIPS:WebClientクラスでWebページを取得するには?
関連TIPS:WebClientクラスでGETメソッドによりクエリ文字列を送信するには?
関連TIPS:WebRequest/WebResponseクラスでWebページを取得するには?
関連TIPS:WebRequest/WebResponseクラスでPOSTメソッドによりデータを送信するには?

この記事と関連性の高い別の.NET TIPS
WebRequest/WebResponseクラスでWebページを取得するには?
WebClientクラスでWebページを取得するには?
Webサーバのプロトコル違反による例外を回避するには?
HttpClientクラスでWebページを取得するには?[C#、VB]
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間