С# Подключение через прокси

Я работаю в офисе, который требует, чтобы все подключения выполнялись через определенный http-прокси. Мне нужно написать простое приложение для запроса некоторых значений с веб-сервера - это легко, если не было прокси. Как я могу сделать прокси-сервер приложений С#? Как я могу сделать какое-либо соединение через прокси?

Ответ 1

Это легко достигается программно, в вашем коде или декларативно в файле 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 object 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, поэтому, пожалуйста, обратитесь к документации для них.

Ответ 2

Если вы используете WebClient, у него есть свойство Proxy, которое вы можете использовать.

Как уже упоминалось, существует несколько способов автоматизации обнаружения/использования параметров прокси-сервера

Web.Config:

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

Использование класса WebProxy, как описано в в этой статье.


Вы также можете настроить параметры прокси-сервера напрямую (config или code), и ваше приложение затем будет использовать их.

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

Ответ 3

Если вы хотите, чтобы приложение использовало прокси-сервер по умолчанию, добавьте его в свой Application.exe.config(где application.exe - это имя вашего приложения):

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

Более подробную информацию можно найти в статье MSDN в System.Net

Ответ 4

Попробуйте этот код. Вызовите его, прежде чем делать какие-либо HTTP-запросы. Код будет использовать прокси-сервер из ваших настроек Internet Explorer. Тем не менее, я использую proxy.Credentials = ...., потому что мой прокси-сервер является NTLM-аутентифицированным сервером Internet Acceleration Server. Дайте ему свист.

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

Ответ 5

Этот однострочник работает для меня:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

CredentialCache.DefaultNetWorkCredentials - настройки прокси, установленные в Internet Explorer.

WebRequest.DefaultWebProxy.Credentials используется для всех подключений к Интернету в приложении.

Ответ 6

Foole-код работал отлично для меня, но в .NET 4.0 не забудьте проверить, является ли прокси NULL, что означает, что прокси-сервер не настроен (вне корпоративной среды)

Итак, вот код, который решил мою проблему с нашим корпоративным прокси

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

Ответ 7

Этот код работал у меня:

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

Ответ 8

Автоматическое определение прокси-сервера - это процесс, с помощью которого веб-прокси-сервер идентифицируется и используется для отправки запросов от имени клиента. Эта функция также известна как Автоматическое обнаружение веб-прокси (WPAD). Когда включено автоматическое определение прокси-сервера, система пытается найти конфигурацию прокси-сервера script, которая отвечает за возврат набора прокси-серверов, которые могут быть использованы для запроса.

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

Ответ 9

            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);

Ответ 10

Я собираюсь использовать пример для добавления к приведенным выше ответам.

Я столкнулся с проблемами прокси, пытаясь установить пакеты через Установщик веб-платформы

В этом тоже используется файл конфигурации 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>

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