|
.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 記事ランキング
本日
月間