DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

プロキシサーバーを指定してダウンロードする

個々のWebRequestで使用するプロキシを設定する

WebRequest.ProxyプロパティWebProxyオブジェクトを設定することにより、プロキシサーバーを指定できます。

プロキシサーバーに「localhost:8080」を指定する例を以下に示します。

VB.NET
コードを隠すコードを選択
'HttpWebRequestオブジェクトの作成
Dim webreq As System.Net.HttpWebRequest = _
    CType(System.Net.WebRequest.Create("http://www.yahoo.com"), _
    System.Net.HttpWebRequest)

'プロキシの設定
'プロキシサーバーに"localhost:8080"を指定
Dim proxy As New System.Net.WebProxy("http://localhost:8080")
webreq.Proxy = proxy

'HttpWebResponseの取得
Dim webres As System.Net.HttpWebResponse = _
    CType(webreq.GetResponse, System.Net.HttpWebResponse)

'受信して表示
Dim st As System.IO.Stream = webres.GetResponseStream()
Dim sr As New System.IO.StreamReader(st)
Console.WriteLine(sr.ReadToEnd())
'閉じる
sr.Close()
st.Close()
C#
コードを隠すコードを選択
//HttpWebRequestオブジェクトの作成
System.Net.HttpWebRequest webreq = (System.Net.HttpWebRequest)
    System.Net.WebRequest.Create("http://www.yahoo.com");

//プロキシの設定
//プロキシサーバーに"localhost:8080"を指定
System.Net.WebProxy proxy =
    new System.Net.WebProxy("http://localhost:8080");
webreq.Proxy = proxy;

//HttpWebResponseの取得
System.Net.HttpWebResponse webres =
    (System.Net.HttpWebResponse) webreq.GetResponse();

//受信して表示
System.IO.Stream st = webres.GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(st);
Console.WriteLine(sr.ReadToEnd());
//閉じる
sr.Close();
st.Close();

.NET Framework 2.0からは、WebClientクラスにProxyプロパティが追加されました。これを使った例を、以下に示します。

VB.NET
コードを隠すコードを選択
'WebClientオブジェクトの作成
Dim wc As New System.Net.WebClient()
'プロキシの設定
wc.Proxy = New System.Net.WebProxy("http://localhost:8080")
'受信して表示
Dim source As String = wc.DownloadString("http://www.yahoo.com")
Console.WriteLine(source)
'閉じる
wc.Dispose()
C#
コードを隠すコードを選択
//WebClientオブジェクトの作成
System.Net.WebClient wc = new System.Net.WebClient();
//プロキシの設定
wc.Proxy = new System.Net.WebProxy("http://localhost:8080");
//受信して表示
string source = wc.DownloadString("http://www.yahoo.com");
Console.WriteLine(source);
//閉じる
wc.Dispose();

バイパスを設定する

WebProxyコンストラクタの2番目のパラメータにTrueを指定すると、ローカルアドレスのプロキシをバイパスする(プロキシを通さずに、直接アクセスする)ようになります(または、WebProxy.BypassProxyOnLocalプロパティをTrueにします)。また、WebProxyコンストラクタの3番目のパラメータに、バイパスするURIの正規表現パターンを文字列の配列で指定できます(または、WebProxy.BypassListプロパティを設定します)。

VB.NET
コードを隠すコードを選択
'ローカルと"dobon.net"をバイパスする
Dim bypassUrls() As String = {"dobon\.net"}
webreq.Proxy = _
    New System.Net.WebProxy("http://localhost:8080", True, bypassUrls)
C#
コードを隠すコードを選択
//ローカルと"dobon.net"をバイパスする
string[] bypassUrls = new string[] {"dobon\\.net"};
webreq.Proxy =
    new System.Net.WebProxy("http://localhost:8080", true ,bypassUrls);

Internet Exploreの設定を使用する

Internet Exploreの設定(コントロールパネルの「インターネットのプロパティ」の設定)を使用するには、WebRequest.GetSystemWebProxyメソッドを使用します。ただし.NET Framework 1.1以前では、WebProxy.GetDefaultProxyメソッドを使用します。

VB.NET
コードを隠すコードを選択
'IEの設定を使用する
webreq.Proxy = System.Net.WebRequest.GetSystemWebProxy()
'.NET Framework 1.1以前では、次のようにする
'webreq.Proxy = System.Net.WebProxy.GetDefaultProxy()
C#
コードを隠すコードを選択
//IEの設定を使用する
webreq.Proxy = System.Net.WebRequest.GetSystemWebProxy();
//.NET Framework 1.1以前では、次のようにする
//webreq.Proxy = System.Net.WebProxy.GetDefaultProxy();

プロキシを使用しないようにする

プロキシを使用しないようにするには、Proxyプロパティにnullを設定します。ただし.NET Framework 1.1以前では、GlobalProxySelection.GetEmptyWebProxyプロパティを使用します。

VB.NET
コードを隠すコードを選択
'プロキシを使用しない
webreq.Proxy = Nothing
'.NET Framework 1.1以前では、次のようにする
'webreq.Proxy = System.Net.GlobalProxySelection.GetEmptyWebProxy()
C#
コードを隠すコードを選択
//プロキシを使用しない
webreq.Proxy = null;
//.NET Framework 1.1以前では、次のようにする
//webreq.Proxy = System.Net.GlobalProxySelection.GetEmptyWebProxy();

プロキシ認証

プロキシサーバーに認証が必要な場合は、WebProxyコンストラクタの4番目のパラメータにICredentialsを指定します。または、WebProxy.Credentialsプロパティを設定します。

VB.NET
コードを隠すコードを選択
Dim proxy As New System.Net.WebProxy("http://localhost:8080")
'ユーザー名とパスワードを設定
proxy.Credentials = New System.Net.NetworkCredential("name", "pass")
webreq.Proxy = proxy
C#
コードを隠すコードを選択
System.Net.WebProxy proxy =
    new System.Net.WebProxy("http://localhost:8080");
//ユーザー名とパスワードを設定
proxy.Credentials = new System.Net.NetworkCredential("name", "pass");
webreq.Proxy = proxy;

すべてのWebRequestで使用するプロキシを設定する

WebRequest.DefaultWebProxyプロパティにプロキシの設定を格納すると、Proxyの設定がされていないすべてのWebRequest(.NET Framework 4.5時点で、FtpWebRequestとHttpWebRequest)で使用されるようになります。WebClientクラスでも内部ではWebRequestを使用していますので、このように設定したプロキシが使われるようになるでしょう。

元々のDefaultWebProxyプロパティが返す設定は、app.configなどの構成ファイルの設定(後述します)です。構成ファイルに設定がない場合は、Internet Explorerの設定を使用します(.NET Framework 2.0以降)。

なお.NET Framework 1.1以前では、DefaultWebProxyプロパティの代わりにGlobalProxySelection.Selectプロパティを使用します。

VB.NET
コードを隠すコードを選択
'グローバルプロキシの設定
Dim proxy As New System.Net.WebProxy("http://localhost:8080")
System.Net.WebRequest.DefaultWebProxy = proxy
'.NET Framework 1.1以前では、次のようにする
'System.Net.GlobalProxySelection.Select = proxy
C#
コードを隠すコードを選択
//グローバルプロキシの設定
System.Net.WebProxy proxy =
    new System.Net.WebProxy("http://localhost:8080");
System.Net.WebRequest.DefaultWebProxy = proxy;
//.NET Framework 1.1以前では、次のようにする
//System.Net.GlobalProxySelection.Select = proxy;

アプリケーション構成ファイルにプロキシの設定を記述する

アプリケーション構成ファイル(app.config)やマシン構成ファイル(machine.config)などに、プロキシの設定を記述しておくことができます。なお、アプリケーション構成ファイルに関して詳しくは、こちらをご覧ください。

例えば以下のような記述をアプリケーション構成ファイルに書き込むことにより、デフォルトで、"http://localhost:8080"のプロキシを使用し、ローカルアドレスと、"dobon.net"をバイパスするようになります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.net>
    <defaultProxy>
      <proxy
        proxyaddress="http://localhost:8080"
        bypassonlocal="True"
      />
      <bypasslist>
        <add address="dobon\.net" />
      </bypasslist>
    </defaultProxy>
  </system.net>
</configuration>

構成ファイルに記述できる設定について詳しくは、MSDNの「<defaultProxy> 要素 (ネットワーク設定)」をご覧ください。

  • 履歴:
  • 2006/11/20 プロキシ認証や、バイパスするURIの指定法を追加。
  • 2007/1/20 .NET Framework 2.0のWebClientに関する情報を追加。
  • 2007/1/24 「アプリケーション構成ファイルにプロキシの設定を記述する」を追加。
  • 2013/7/4 「Internet Exploreの設定を使用する」「プロキシを使用しないようにする」「すべてのWebRequestで使用するプロキシを設定する」を.NET Framework 2.0以降に対応させたなど。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。