C # łączenie przez serwer proxy

94

Pracuję w biurze, które wymaga, aby wszystkie połączenia były wykonywane przez określony serwer proxy http. Muszę napisać prostą aplikację do odpytywania niektórych wartości z serwera WWW - jest to łatwe, gdyby nie było serwera proxy. Jak ustawić obsługę serwera proxy aplikacji C #? Jak mogę nawiązać jakiekolwiek połączenie przez proxy?

KalEl
źródło

Odpowiedzi:

105

Można to łatwo osiągnąć programowo, w kodzie lub deklaratywnie w pliku web.config lub app.config.

Możesz programowo utworzyć serwer proxy w następujący sposób:

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

Zasadniczo przypisujesz WebProxyobiekt do właściwości requestobiektu proxy. Spowoduje requestto użycie proxyzdefiniowanego przez Ciebie.

Aby osiągnąć to samo deklaratywnie, możesz wykonać następujące czynności:

<system.net>
  <defaultProxy>
    <proxy
      proxyaddress="http://[your proxy address and port number]"
      bypassonlocal="false"
    />
  </defaultProxy>
</system.net>

w pliku web.config lub app.config. Spowoduje to ustawienie domyślnego serwera proxy, którego będą używać wszystkie żądania http. W zależności od tego, co dokładnie chcesz osiągnąć, możesz wymagać niektórych dodatkowych atrybutów elementu defaultProxy / proxy lub nie , więc zapoznaj się z ich dokumentacją.

CraigTP
źródło
w programowym przykładzie nie ustawiłeś portu, DLACZEGO?
Skuta
@Skuta - Bez konkretnego powodu. To tylko przeoczenie, ponieważ w tym przykładzie używam konstruktora, który przyjmuje adres URL (jako ciąg znaków) i wartość logiczną, aby określić, czy adresy lokalne są pomijane. Jeśli potrzebujesz określonego numeru portu, może być lepiej użyć przeciążonego konstruktora, który zezwala na adres URL (jako ciąg) i numer portu (jako Int32), a następnie BypassProxyOnLocalnatychmiast ustaw właściwość na True (jeśli jest to wymagane).
CraigTP
2
@Skuta - zredagowałem swój post, aby to wyjaśnić i upewnić się, że przykłady programowe i deklaratywne faktycznie robią to samo!
CraigTP
23

Jeśli używasz WebClient, ma właściwość Proxy, której możesz użyć.

Jak wspomnieli inni, istnieje kilka sposobów automatyzacji wykrywania / używania ustawień proxy

Web.Config:

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

Korzystanie z klasy WebProxy zgodnie z opisem w tym artykule .


Możesz również skonfigurować ustawienia proxy bezpośrednio (konfiguracja lub kod), a Twoja aplikacja będzie ich używać.

Web.Config:

<system.net>
  <defaultProxy>
    <proxy
      proxyaddress="http://[proxy address]:[proxy port]"
      bypassonlocal="false"
    />
  </defaultProxy>
</system.net>

Kod:

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();
Oded
źródło
7

Wypróbuj ten kod. Wywołaj to przed wykonaniem jakichkolwiek żądań http. Kod będzie korzystał z serwera proxy z ustawień programu Internet Explorer - jednak używam jednej rzeczy, proxy.Credentials = ....ponieważ mój serwer proxy jest serwerem akceleracji internetowej z uwierzytelnianiem NTLM. Daj spokój.

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);
    }
}
Seamus
źródło
3
WebProxy.GetDefaultProxyjest przestarzały od Framework 4.5 i ta metoda zwraca null. Lepiej zastanów się przed użyciem CredentialCache.DefaultNetworkCredentials. Jeśli umieściłeś coś w CredentialCache i Twój serwer proxy wymaga takich poświadczeń, to powinno działać. W przeciwnym razie to nie pomoże.
cassandrad
6

Jeśli chcesz, aby aplikacja korzystała z domyślnego serwera proxy systemu, dodaj to do pliku Application.exe.config (gdzie application.exe to nazwa Twojej aplikacji):

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

Więcej szczegółów można znaleźć w artykule MSDN w witrynie System.Net

Robert Christie
źródło
Uwaga: Sekcja: <system.net> znajduje się w sekcji <configuration> lub pliku exe.config. To sprawiło, że proxy działało w prostej aplikacji konsolowej, którą przygotowałem.
John Dyer,
5

Ta jednolinijka działa dla mnie:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

CredentialCache.DefaultNetWorkCredentials to ustawienia proxy określone w programie Internet Explorer.

WebRequest.DefaultWebProxy.Credentials jest używany do wszystkich połączeń internetowych w aplikacji.

Coert Grobbelaar
źródło
1
„CredentialCache.DefaultNetWorkCredentials to ustawienia serwera proxy ustawione w programie Internet Explorer”. Czy nadal tak jest? Nie mogę znaleźć nigdzie w Opcje internetowe> Połączenia> Ustawienia sieci LAN, aby wpisać nazwę użytkownika i hasło.
Matt
Z dokumentacji: „W przypadku aplikacji po stronie klienta są to zwykle poświadczenia systemu Windows (nazwa użytkownika, hasło i domena) użytkownika uruchamiającego aplikację”.
Coert Grobbelaar
Ta odpowiedź może trochę się postarzała, ale jestem prawie pewien, że była prawdziwa w przypadku okien z 2015 roku
Coert Grobbelaar
4

Kod Foole działał dla mnie idealnie, ale w .NET 4.0 nie zapomnij sprawdzić, czy Proxy ma wartość NULL, co oznacza, że ​​serwer proxy nie jest skonfigurowany (poza środowiskiem korporacyjnym)

Oto kod, który rozwiązał mój problem z naszym korporacyjnym serwerem proxy

WebClient web = new WebClient();
if (web.Proxy != null)
    web.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
JCH2k
źródło
3

Ten kod zadziałał dla mnie:

WebClient wc = new WebClient();
wc.Proxy.Credentials = CredentialCache.DefaultCredentials;
Foole
źródło
0

Automatyczne wykrywanie proxy to proces, dzięki któremu serwer proxy sieci Web jest identyfikowany przez system i używany do wysyłania żądań w imieniu klienta. Ta funkcja jest również znana jako Automatyczne wykrywanie serwera proxy sieci Web (WPAD). Gdy automatyczne wykrywanie proxy jest włączone, system próbuje zlokalizować skrypt konfiguracyjny proxy, który jest odpowiedzialny za zwrócenie zestawu serwerów proxy, których można użyć dla żądania.

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

Elijah Glover
źródło
4
Jak to odpowiada na pytanie? W jaki sposób PO może wykorzystać te informacje?
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
źródło
5
Lepiej jest napisać wyjaśnienie swojego rozwiązania, a nie tylko kod pocztowy. Czy możesz edytować jakiś tekst, który pomógłby czytelnikowi?
Brian Tompsett - 汤 莱恩
0

Posłużę się przykładem, aby dodać do powyższych odpowiedzi.

Napotkałem problemy z serwerem proxy podczas próby zainstalowania pakietów za pośrednictwem Instalatora platformy internetowej

To także używa pliku konfiguracyjnego, którym jest WebPlatformInstaller.exe.config

Wypróbowałem zmiany sugerowane na tym forum IIS, które jest

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
  <system.net>    
     <defaultProxy enabled="True" useDefaultCredentials="True"/>      
   </system.net>
</configuration>

i

<?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>

Żadne z nich nie działało.

To, co zadziałało dla mnie, to -

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

Aby móc z niego korzystać, moduł musiał zostać zarejestrowany w Instalatorze platformy internetowej.

Mukus
źródło