C#プロキシ経由の接続


92

すべての接続を特定のhttpプロキシ経由で行う必要があるオフィスで働いています。Webサーバーからいくつかの値をクエリする単純なアプリケーションを作成する必要があります-プロキシがなければ簡単です。C#アプリケーションをプロキシ対応にするにはどうすればよいですか?プロキシを介してどのような接続を行うことができますか?

回答:


103

これは、プログラムで、コードで、または宣言的にweb.configまたはapp.configで簡単に実現できます。

次のようにプログラムでプロキシを作成できます。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("[ultimate destination of your request]");
WebProxy myproxy = new WebProxy("[your proxy address]", [your proxy port number]);
myproxy.BypassProxyOnLocal = false;
request.Proxy = myproxy;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse) request.GetResponse();

基本的WebProxyに、requestオブジェクトのproxyプロパティにオブジェクトを割り当てています。これによりrequestproxy定義したものが使用されます。

同じことを宣言的に実現するには、次のようにします。

<system.net>
  <defaultProxy>
    <proxy
      proxyaddress="http://[your proxy address and port number]"
      bypassonlocal="false"
    />
  </defaultProxy>
</system.net>

web.configまたはapp.config内。これにより、すべてのhttp要求が使用するデフォルトのプロキシが設定されます。正確に何を達成する必要があるかによって、defaultProxy / proxy要素の追加の属性の一部が必要になる場合と必要とされない場合がありますので、それらのドキュメントを参照してください。


プログラムの例では、なぜポートを設定しなかったのですか?
スクタ

@Skuta-特に理由はありません。その例のように、それは単なる見落としでした。ローカルアドレスがバイパスされるかどうかを判断するために、URL(文字列として)とブール値を取得するコンストラクターを使用しています。特定のポート番号が必要な場合は、URL(文字列として)およびポート番号(Int32として)を許可するオーバーロードされたコンストラクターを使用し、その後BypassProxyOnLocalすぐにプロパティをTrue(必要な場合)に設定することをお勧めします。
CraigTP 2009

2
@Skuta-これを明確にし、プログラマティックな例と宣言的な例が実際に同じことを行うように、投稿を編集しました!
CraigTP 2009

23

を使用WebClientしている場合は、使用できるProxyプロパティがあります。

他の人が述べたように、プロキシ設定の検出/使用を自動化するにはいくつかの方法があります

Web.Config:

<system.net>
   <defaultProxy enabled="true" useDefaultCredentials="true">
     <proxy usesystemdefault="true" bypassonlocal="true" />
   </defaultProxy>
</system.net>

この記事で説明されているWebProxyクラスの使用。


プロキシ設定(構成またはコード)を直接構成することもでき、アプリはそれらを使用します。

Web.Config:

<system.net>
  <defaultProxy>
    <proxy
      proxyaddress="http://[proxy address]:[proxy port]"
      bypassonlocal="false"
    />
  </defaultProxy>
</system.net>

コード:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("url");
WebProxy myproxy = new WebProxy("[proxy address]:[proxy port]", false);
request.Proxy = myproxy;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse) request.GetResponse();

7

このコードを試してください。httpリクエストを行う前に呼び出します。このコードでは、Internet Explorerの設定からプロキシを使用します。ただし、proxy.Credentials = ....プロキシサーバーはNTLM認証済みのインターネットアクセラレーションサーバーであるため、使用します。ちょっと気をつけて。

static void setProxy()
{
    WebProxy proxy = (WebProxy)WebProxy.GetDefaultProxy();
    if(proxy.Address != null)
    {
        proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
        WebRequest.DefaultWebProxy = new System.Net.WebProxy(proxy.Address, proxy.BypassProxyOnLocal, proxy.BypassList, proxy.Credentials);
    }
}

3
WebProxy.GetDefaultProxyFramework 4.5から廃止され、このメソッドはnullを返します。使用する前によく考えてくださいCredentialCache.DefaultNetworkCredentials。CredentialCacheに何かを入れていて、プロキシがそのような資格情報を必要とする場合、それは機能するはずです。それ以外の場合は役に立ちません。
cassandrad

6

アプリでシステムのデフォルトプロキシを使用する場合は、これをApplication.exe.configに追加します(application.exeはアプリケーションの名前です)。

<system.net>
   <defaultProxy enabled="true" useDefaultCredentials="true">
   <proxy usesystemdefault="true" bypassonlocal="true" />
   </defaultProxy>
</system.net>

詳細については、System.NetのMSDN記事を参照してください。


注:<system.net>セクションは、<configuration>セクションまたはexe.configファイル内にあります。これにより、私が作成した単純なコンソールアプリでプロキシが機能するようになりました。
John Dyer

5

このワンライナーは私にとってはうまくいきます:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

CredentialCache.DefaultNetWorkCredentials Internet Explorerで設定されたプロキシ設定です。

WebRequest.DefaultWebProxy.Credentials アプリケーションのすべてのインターネット接続に使用されます。


1
「CredentialCache.DefaultNetWorkCredentialsは、Internet Explorerで設定されたプロキシ設定です。」これはまだ事実ですか?ユーザー名とパスワードを書き込むインターネットオプション>接続> LAN設定のどこにも見つかりません。
マット

ドキュメントから:「クライアント側アプリケーションの場合、これらは通常、アプリケーションを実行しているユーザーのWindows資格情報(ユーザー名、パスワード、ドメイン)です。」
Coert Grobbelaar

この回答は少し古くなっている可能性がありますが、2015年のWindowsには当てはまったと確信しています
Coert Grobbelaar

4

Fooleのコードは私にとっては完璧に機能しましたが、.NET 4.0では、ProxyがNULLであるかどうかを確認することを忘れないでください。

だからここに私たちの企業プロキシで私の問題を解決したコードがあります

WebClient web = new WebClient();
if (web.Proxy != null)
    web.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;

3

このコードは私のために働きました:

WebClient wc = new WebClient();
wc.Proxy.Credentials = CredentialCache.DefaultCredentials;

0

自動プロキシ検出は、Webプロキシサーバーがシステムによって識別され、クライアントに代わって要求を送信するために使用されるプロセスです。この機能は、Webプロキシ自動検出(WPAD)とも呼ばれます。自動プロキシ検出が有効になっている場合、システムは、要求に使用できる一連のプロキシを返す責任があるプロキシ構成スクリプトを見つけようとします。

http://msdn.microsoft.com/en-us/library/fze2ytx2.aspx


4
これはどのように質問に答えますか?OPはこの情報をどのように使用できますか?
Cullub

0
            var getHtmlWeb = new HtmlWeb() { AutoDetectEncoding = false, OverrideEncoding = Encoding.GetEncoding("iso-8859-2") };

            WebProxy myproxy = new WebProxy("127.0.0.1:8888", false);
            NetworkCredential cred = (NetworkCredential)CredentialCache.DefaultCredentials;
            var document = getHtmlWeb.Load("URL", "GET", myproxy, cred);

5
単にコードを投稿するのではなく、ソリューションの説明を書くことをお勧めします。読者に役立つテキストを編集できますか?
ブライアントンプセット-汤莱恩

0

上記の回答に追加する例を使用します。

Web Platform Installerを介してパッケージをインストールしようとすると、プロキシの問題が発生しました

それもWebPlatformInstaller.exe.configである構成ファイルを使用します

私はこのIISフォーラムで提案されている編集を試してみました

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
  <system.net>    
     <defaultProxy enabled="True" useDefaultCredentials="True"/>      
   </system.net>
</configuration>

そして

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
   <system.net>    
     <defaultProxy>      
          <proxy 
               proxyaddress="http://yourproxy.company.com:80" 
               usesystemdefault="True"
               autoDetect="False" />    
     </defaultProxy>  
   </system.net>
</configuration>

これらはどれも機能しませんでした。

私のために働いたのはこれでした-

<system.net>    
    <defaultProxy enabled="true" useDefaultCredentials="false">
      <module type="WebPI.Net.AuthenticatedProxy, WebPI.Net, Version=1.0.0.0, Culture=neutral, PublicKeyToken=79a8d77199cbf3bc" />
    </defaultProxy>  
 </system.net>

モジュールを使用するには、モジュールをWebプラットフォームインストーラーに登録する必要がありました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.