C # веб-клиент и прокси-сервер - PullRequest
32 голосов
/ 03 мая 2009

Я использую класс веб-клиента в своем исходном коде для загрузки строки с использованием http.

Это работало нормально. Однако все клиенты компании теперь подключены к прокси-серверу. И проблема началась с этого.

Когда я тестировал свое приложение, я не думаю, что оно может проходить через прокси-сервер, так как генерируется исключение «нет ответа от xxx.xxx.xxx.xxx, который является IP-адресом прокси-сервера» 1005 *

Однако я все еще могу перейти к URL-адресу веб-сайта, и он правильно отображает строку в браузере при подключении через прокси-сервер, но не при использовании моего веб-клиента.

Есть ли в веб-клиенте что-то, что мне нужно настроить, чтобы я мог получить доступ к 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;
    }
}

Ответы [ 6 ]

40 голосов
/ 28 мая 2012

Мое решение:

WebClient client = new WebClient();
WebProxy wp = new WebProxy(" proxy server url here");
client.Proxy = wp;
string str = client.DownloadString("http://www.google.com");
17 голосов
/ 15 августа 2014

Если вам нужно пройти аутентификацию на прокси, вам нужно установить UseDefaultCredentials на false и установить прокси 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");
9 голосов
/ 17 января 2014

Я столкнулся с той же проблемой, но с помощью веб-клиента для загрузки файла из Интернета с помощью приложения Winform решение добавлялось в app.config:

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

То же решение будет работать для приложения asp.net, вставляющего те же строки в web.config.

Надеюсь, это поможет.

8 голосов
/ 11 августа 2014

Ответ, предложенный Джонатаном, является правильным, но требует, чтобы вы указали учетные данные прокси и URL в коде. Обычно лучше разрешить использование учетных данных в качестве настроек в системе по умолчанию (пользователи обычно настраивают параметры локальной сети в любом случае, если они используют прокси-сервер) ...

Приведенный ниже ответ был предоставлен Давиде в предыдущем ответе, но для этого необходимо изменить файлы app.config. Это решение, вероятно, более полезно, поскольку оно делает то же самое В КОДЕ.

Чтобы приложение могло использовать настройки прокси-сервера по умолчанию, используемые в системе пользователя, можно использовать следующий код:

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

Это позволит коду приложения использовать прокси-сервер (с зарегистрированными учетными данными и настройками URL-адреса прокси-сервера по умолчанию) ... Никаких головных болей! :)

Надеюсь, что это поможет будущим читателям этой страницы решить их проблему!

6 голосов
/ 03 мая 2009

Вам необходимо настроить прокси в объекте WebClient.

См. Свойство WebClient.Proxy:

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

2 голосов
/ 30 декабря 2016
byte[] data;
using (WebClient client = new WebClient())
{
    ICredentials cred;
    cred = new NetworkCredential("xmen@test.com", "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);
...