Использование C # WebClient с прокси - нет запроса на прокси-сервер? - PullRequest
4 голосов
/ 20 октября 2011

У нас есть фоновая операция (служба Windows), которую мы хотим использовать через прокси-сервер.

По сути, мы делаем это:

public WebClient GetWebClient(){
   var webClient = new WebClient();
   webClient.proxy = new WebProxy(Configuration.ProxyHost, Configuration.ProxyPort);

   // add a bunch of headers to the WebClient (sessionids, etc.)

   return webClient;
}

Прокси-сервер - это тот, который мы настроили сами, используя FreeProxy .

Я включил ведение журнала и на машине, с которой я тестирую, и могу подтвердить, что запросы отправляются прокси при его использовании в Firefox.

Для прокси-сервера аутентификация не требуется, за исключением того, что IP-адрес должен находиться в нашем офисе (что, как я полагаю, из свидетельства Firefox, не является проблемой).

Однако в рамках нашего фонового процесса я, похоже, не использую прокси-сервер при использовании веб-клиента:

using(var wc = GetWebClient())
using(var s = wc.OpenRead("someurl"))
using(var sr = new StreamReader(s)){
    return sr.ReadToEnd();
}

Я не получаю ошибок от прокси-сервера, однако, похоже, что мы просто обходимся без него, даже если прокси-сервер явно установлен.

Похоже, информация возвращается нормально, но не через наш прокси.

Что-то мне не хватает при использовании прокси с WebClient?

редактировать: подробнее. Если мы отключим прокси-службу на сервере, то получим исключение, которое мы не сможем подключить. Похоже, что веб-клиент пытается связаться с прокси, но этот трафик фактически не проходит через прокси.

Inner Exception: SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

Ответы [ 3 ]

1 голос
/ 27 октября 2011

Оказывается, что FreeProxy не принимал HTTPS-трафик.

Я полагаю, что прокси-сервер должен возвращать типы трафика, который он может маршрутизировать, и если он не может, веб-клиент ничего не делает.

Переключен на использование пакета Burp в качестве нашего прокси, поскольку он может принимать HTTPS..

http://portswigger.net/burp/

0 голосов
/ 21 октября 2011

Насколько я могу судить, вы используете класс WebClient правильно.Я могу видеть следующий запрос ...

using(var client = new WebClient())
{
    client.Proxy = new WebProxy("localhost", 8888);
    Console.WriteLine(client.DownloadString("http://www.google.com"));
}

в Fiddler, работающем на моем локальном компьютере.Теперь, если я выключаю Fiddler, я получаю исключение WebException:

Unable to connect to the remote server

с внутренним исключением SocketException:

No connection could be made because the target machine actively refused it 127.0.0.1:8888

Итак, с учетом сказанного, я предполагаю, что ваш прокси работаеткак и предполагалось, но он не регистрирует исходящий HTTP-запрос.

0 голосов
/ 20 октября 2011

Необходимо либо настроить окна для использования прокси по умолчанию, либо установить прокси вручную в своем коде, см .: http://msdn.microsoft.com/en-us/library/system.net.webclient.proxy(v=VS.100).aspx

...