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


92

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

Відповіді:


104

Цього легко досягти або програмно, у вашому коді, або декларативно в 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 , тому, будь ласка, зверніться до документації щодо них.


у програмному прикладі ви не встановили порт, ЧОМУ?
Скута

@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, і ваш проксі вимагає таких облікових даних, тоді це має спрацювати. Інакше це не допоможе.
Кассандрад

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 використовується для всіх підключень до Інтернету в програмі.


1
"CredentialCache.DefaultNetWorkCredentials - це налаштування проксі, встановлені в Internet Explorer". Це все ще так? Я не можу знайти ніде в меню «Властивості браузера»> «З’єднання»> «Налаштування локальної мережі», щоб написати ім’я користувача та пароль.
Метт

З документації: "Для клієнтської програми це, як правило, облікові дані Windows (ім'я користувача, пароль та домен) користувача, який запускає програму."
Coert Grobbelaar,

Можливо, ця відповідь постаріла дещо погано, але я впевнений, що вона була правдою для вікон 2015 року
Coert Grobbelaar

4

Код Foole для мене працював ідеально, але в .NET 4.0 не забудьте перевірити, чи є проксі NULL, що означає, що проксі не налаштований (поза корпоративним середовищем)

Отже, ось код, який вирішив мою проблему з нашим корпоративним проксі

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

3

Цей код спрацював для мене:

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

0

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

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


4
Як це відповідає на питання? Як може ОП використовувати цю інформацію?
Куллуб

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

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>

Модуль потрібно було зареєструвати у програмі встановлення веб-платформи, щоб використовувати його.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.