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

95

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

KalEl
источник

Ответы:

106

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

CraigTP
источник
в программном примере вы не установили порт, ПОЧЕМУ?
Skuta
@Skuta - Без особой причины. Это было просто оплошностью, поскольку в этом примере я использую конструктор, который принимает URL-адрес (в виде строки) и логическое значение, чтобы определить, обойдены ли локальные адреса. Если вам нужен конкретный номер порта, может быть лучше использовать перегруженный конструктор, который разрешает URL-адрес (как строку) и номер порта (как Int32), а затем BypassProxyOnLocalсразу же после этого установить для свойства значение True (при необходимости).
CraigTP
2
@Skuta - я отредактировал свой пост, чтобы прояснить это и убедиться, что программные и декларативные примеры действительно делают одно и то же!
CraigTP
23

Если вы используете 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();
Одед
источник
7

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

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);
    }
}
Шеймус
источник
3
WebProxy.GetDefaultProxyустарело, начиная с Framework 4.5, и этот метод возвращает значение null. Лучше подумайте перед использованием CredentialCache.DefaultNetworkCredentials. Если вы что-то поместили в CredentialCache, и вашему прокси-серверу требуются такие учетные данные, то все должно работать. Иначе не поможет.
cassandrad
6

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

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

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

Роберт Кристи
источник
Примечание. Раздел: <system.net> находится внутри раздела <configuration> или файла exe.config. Это заставило прокси-сервер работать в простом консольном приложении, которое я придумал.
Джон Дайер
5

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

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

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

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

Coert Grobbelaar
источник
1
«CredentialCache.DefaultNetWorkCredentials - это настройки прокси, установленные в Internet Explorer». Так ли это до сих пор? Я не могу найти нигде в «Свойства обозревателя»> «Подключения»> «Настройки локальной сети», чтобы написать имя пользователя и пароль.
Мэтт
Из документации: «Для клиентского приложения это обычно учетные данные Windows (имя пользователя, пароль и домен) пользователя, запускающего приложение».
Coert Grobbelaar
Этот ответ, возможно, немного устарел, но я почти уверен, что он был правдой для окон 2015 года
Coert Grobbelaar
4

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

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

WebClient web = new WebClient();
if (web.Proxy != null)
    web.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
JCH2k
источник
3

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

WebClient wc = new WebClient();
wc.Proxy.Credentials = CredentialCache.DefaultCredentials;
Дурак
источник
0

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

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

Элайджа Гловер
источник
4
Как это отвечает на вопрос? Как OP может использовать эту информацию?
Cullub
0
            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);
JD-V
источник
5
Желательно написать объяснение вашего решения, а не просто почтовый индекс. Можете ли вы отредактировать какой-нибудь текст, который поможет читателю?
Брайан Томпсетт - 莱恩
0

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

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

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

Для использования модуля необходимо зарегистрировать его в установщике веб-платформы.

Мукус
источник