|   | 
 
|  
 .NET TIPS 
プロキシ設定によりWebページへのアクセスを高速化するには?[2.0のみ、C#、VB]
デジタルアドバンテージ 遠藤 孝信 
2007/11/22 | 
  | 
 
 
 
 | 
 .NET Frameworkでは、WebClientクラスやHttpWebRequestクラス(どちらもSystem.Net名前空間)などを使用することにより、簡単にWebページやWeb上のリソースにアクセスできるようになっている*。しかしこれらのクラスを利用したアプリケーションは、実行時に非常に時間がかかってしまう場合がある。
 例えば次のサンプル・プログラムは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) | 
 この場合には、アプリケーション全体でプロキシが使用されなくなる。
 
|  
 | 
 
generated by  
 | 
 
 
 | 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間