web-dev-qa-db-ja.com

プロキシを介したC#接続

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

86
KalEl

これは、プログラムで、コードで、または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プロパティに割り当てます。このrequestは、定義したproxyを使用します。

同じことを宣言的に達成するために、次のことができます。

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

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

98
CraigTP

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();
22
Oded

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

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);
    }
}
6
Seamus

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

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

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

6
Robert Christie

このワンライナーは私のために働く:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

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

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

6

Fooleのコードは完全に機能しましたが、.NET 4.0では、ProxyがNULLかどうかを確認することを忘れないでください。これは、プロキシが構成されていないことを意味します(企業環境外)

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

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

このコードは私のために働いています:

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

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

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

0
Elijah Glover

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

Web Platform Installer経由でパッケージをインストールしようとしたときにプロキシの問題に遭遇しました

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

this IIS forum で提案を編集してみました

<?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 Platform Installerに登録する必要がありました。

0
Mukus
            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);
0
JD-V