web-dev-qa-db-ja.com

C#webclientおよびプロキシサーバー

Httpを使用して文字列をダウンロードするために、ソースコードでWebクライアントクラスを使用しています。

これは正常に機能していました。ただし、会社のクライアントはすべてプロキシサーバーに接続されています。そして、問題はこれから始まりました。

アプリケーションをテストしたときに、プロキシサーバーを通過できるとは思いません。例外がスローされ続けるのは、「プロキシサーバーのIPアドレスであるxxx.xxx.xxx.xxxからの応答がありません。

ただし、WebサイトのURLにナビゲートすることはできますが、プロキシサーバー経由で接続するときはブラウザーに文字列が正しく表示されますが、Webクライアントを使用するときは表示されません。

Webクライアントに、プロキシサーバーの背後からURLにアクセスできるように構成する必要があるものがありますか?

using (WebClient wc = new WebClient())
{
    string strURL = "http://xxxxxxxxxxxxxxxxxxxxxxxx";

    //Download only when the webclient is not busy.
    if (!wc.IsBusy)
    {
        string rtn_msg = string.Empty;
        try
        {
            rtn_msg = wc.DownloadString(new Uri(strURL));
            return rtn_msg;
        }
        catch (WebException ex)
        {
            Console.Write(ex.Message);
            return false;
        }
        catch (Exception ex)
        {
            Console.Write(ex.Message);
            return false;
        }
    }
    else
    {
        System.Windows.Forms.MessageBox.Show("Busy please try again");
        return false;
    }
}
33
ant2009

私の解決策:

WebClient client = new WebClient();
WebProxy wp = new WebProxy(" proxy server url here");
client.Proxy = wp;
string str = client.DownloadString("http://www.google.com");
41
Jonathan

プロキシに対して認証する必要がある場合は、UseDefaultCredentialsfalseに設定し、プロキシCredentialsを設定する必要があります。

WebProxy proxy = new WebProxy();
proxy.Address = new Uri("mywebproxyserver.com");
proxy.Credentials = new NetworkCredential("usernameHere", "pa****rdHere");  //These can be replaced by user input
proxy.UseDefaultCredentials = false;
proxy.BypassProxyOnLocal = false;  //still use the proxy for local addresses

WebClient client = new WebClient();
client.Proxy = proxy;

string doc = client.DownloadString("http://www.google.com/");

必要なのが単純なプロキシだけである場合は、上記の行のほとんどをスキップします。あなたに必要なのは:

WebProxy proxy = new WebProxy("mywebproxyserver.com");
17
Cullub

私は同じ問題に遭遇しましたが、Winformアプリケーションでインターネットからファイルをダウンロードするためにwebclientを使用して、ソリューションがapp.configに追加していました:

<system.net>
    <defaultProxy useDefaultCredentials="true" />
</system.net>

同じソリューションは、web.configに同じ行を挿入するasp.netアプリでも機能します。

それが役立つことを願っています。

9
Davide

ジョナサンが提案した答えは適切ですが、コードでプロキシの資格情報とURLを指定する必要があります。通常、デフォルトではシステムのセットアップとして資格情報の使用を許可する方が良いです(ユーザーは通常、プロキシを使用する場合に備えてLAN設定を構成します)...

以下の回答は、以前の回答でDavideによって提供されましたが、app.configファイルを変更する必要があります。このソリューションは、コード内で同じことを行うため、おそらくより便利です。

ユーザーのシステムで使用されているデフォルトのプロキシ設定をアプリケーションで使用できるようにするには、次のコードを使用できます。

IWebProxy wp = WebRequest.DefaultWebProxy;
wp.Credentials = CredentialCache.DefaultCredentials; 
wc.Proxy = wp;

これにより、アプリケーションコードがプロキシを使用できるようになります(ログインした資格情報とデフォルトのプロキシURL設定を使用)...頭痛の種はありません! :)

これがこのページの今後の視聴者が問題を解決するのに役立つことを願っています!

9
Bharat Mallapur

WebClientオブジェクトでプロキシを構成する必要があります。

WebClient.Proxyプロパティを参照してください。

http://msdn.Microsoft.com/en-us/library/system.net.webclient.proxy(VS.80).aspx

6
Winston Smith
byte[] data;
using (WebClient client = new WebClient())
{
    ICredentials cred;
    cred = new NetworkCredential("[email protected]", "mybestpassword");
    client.Proxy = new WebProxy("192.168.0.1",8000);
    client.Credentials = cred;
    string myurl="http://mytestsite.com/source.jpg";
    data = client.DownloadData(myUrl);
}

File.WriteAllBytes(@"c:\images\target.jpg", data);
3
Ayhan Sarıtaş