C # Verbindung über Proxy herstellen

92

Ich arbeite in einem Büro, in dem alle Verbindungen über einen bestimmten http-Proxy hergestellt werden müssen. Ich muss eine einfache Anwendung schreiben, um einige Werte von einem Webserver abzufragen - es ist einfach, wenn es keinen Proxy gibt. Wie kann ich die C # -Anwendung für den Proxy sensibilisieren? Wie kann ich eine Verbindung über einen Proxy herstellen?

KalEl
quelle

Antworten:

103

Dies kann entweder programmgesteuert, in Ihrem Code oder deklarativ entweder in der web.config oder in der app.config erreicht werden.

Sie können einen Proxy wie folgt programmgesteuert erstellen:

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

Grundsätzlich weisen Sie das WebProxyObjekt der requestObjekteigenschaft zu proxy. Dies requestwird dann das von proxyIhnen definierte verwenden.

Um dasselbe deklarativ zu erreichen, können Sie Folgendes tun:

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

in Ihrer web.config oder app.config. Dadurch wird ein Standardproxy festgelegt, den alle http-Anforderungen verwenden. Abhängig davon, was genau Sie erreichen möchten, benötigen Sie möglicherweise einige der zusätzlichen Attribute des defaultProxy / proxy- Elements. Weitere Informationen finden Sie in der Dokumentation.

CraigTP
quelle
Im Programmbeispiel haben Sie den Port nicht festgelegt. WARUM?
Skuta
@ Skuta - Kein besonderer Grund. Das war nur ein Versehen, da ich in diesem Beispiel den Konstruktor verwende, der die URL (als Zeichenfolge) und einen Booleschen Wert verwendet, um festzustellen, ob lokale Adressen umgangen werden. Wenn Sie eine bestimmte Portnummer benötigen, ist es möglicherweise besser, den überladenen Konstruktor zu verwenden, der die URL (als Zeichenfolge) und die Portnummer (als Int32) zulässt, und die BypassProxyOnLocalEigenschaft unmittelbar danach auf True (falls erforderlich) zu setzen.
CraigTP
2
@Skuta - Ich habe meinen Beitrag bearbeitet, um dies zu verdeutlichen und sicherzustellen, dass die programmatischen und deklarativen Beispiele tatsächlich dasselbe tun!
CraigTP
23

Wenn Sie verwenden WebClient, verfügt es über eine Proxy- Eigenschaft, die Sie verwenden können.

Wie bereits erwähnt, gibt es verschiedene Möglichkeiten, die Erkennung / Verwendung von Proxy-Einstellungen zu automatisieren

Web.Config:

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

Verwendung der WebProxy-Klasse wie in diesem Artikel beschrieben .


Sie können die Proxy-Einstellungen auch direkt (Konfiguration oder Code) mitgestalten, und Ihre App verwendet diese dann.

Web.Config:

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

Code:

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

Versuchen Sie diesen Code. Rufen Sie es auf, bevor Sie http-Anfragen stellen. Der Code verwendet den Proxy aus Ihren Internet Explorer-Einstellungen. Eines verwende ich jedoch, proxy.Credentials = ....da mein Proxyserver ein NTLM-authentifizierter Internet Acceleration Server ist. Probieren Sie es aus.

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
quelle
3
WebProxy.GetDefaultProxyist seit Framework 4.5 veraltet und diese Methode gibt null zurück. Überlegen Sie besser, bevor Sie es verwenden CredentialCache.DefaultNetworkCredentials. Wenn Sie etwas in CredentialCache eingefügt haben und Ihr Proxy solche Anmeldeinformationen benötigt, sollte es funktionieren. Sonst hilft es nicht.
Cassandrad
6

Wenn die App den Systemstandard-Proxy verwenden soll, fügen Sie diesen Ihrer Application.exe.config hinzu (wobei application.exe der Name Ihrer Anwendung ist):

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

Weitere Details finden Sie im MSDN-Artikel auf System.Net

Robert Christie
quelle
Hinweis: Der Abschnitt: <system.net> befindet sich im Abschnitt <configuration> oder in der Datei exe.config. Dadurch funktionierte das Proxy-Zeug in einer einfachen Konsolen-App, die ich mir ausgedacht hatte.
John Dyer
5

Dieser Einzeiler funktioniert für mich:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

CredentialCache.DefaultNetWorkCredentials ist die in Internet Explorer festgelegte Proxy-Einstellung.

WebRequest.DefaultWebProxy.Credentials wird für alle Internetverbindungen in der Anwendung verwendet.

Coert Grobbelaar
quelle
1
"CredentialCache.DefaultNetWorkCredentials sind die in Internet Explorer festgelegten Proxy-Einstellungen". Ist das noch der Fall? Unter Internetoptionen> Verbindungen> LAN-Einstellungen kann ich keinen Benutzernamen und kein Kennwort finden.
Matt
Aus den Dokumenten: "Bei einer clientseitigen Anwendung sind dies normalerweise die Windows-Anmeldeinformationen (Benutzername, Kennwort und Domäne) des Benutzers, der die Anwendung ausführt."
Coert Grobbelaar
Diese Antwort mag etwas schlecht gealtert sein, aber ich bin mir ziemlich sicher, dass sie für 2015 Windows zutraf
Coert Grobbelaar
4

Der Code von Foole funktionierte perfekt für mich, aber vergessen Sie in .NET 4.0 nicht zu überprüfen, ob Proxy NULL ist, was bedeutet, dass kein Proxy konfiguriert ist (außerhalb der Unternehmensumgebung).

Hier ist der Code, der mein Problem mit unserem Unternehmens-Proxy gelöst hat

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

Dieser Code hat bei mir funktioniert:

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

Die automatische Proxyerkennung ist ein Prozess, bei dem ein Webproxyserver vom System identifiziert und zum Senden von Anforderungen im Namen des Clients verwendet wird. Diese Funktion wird auch als Web Proxy Auto-Discovery (WPAD) bezeichnet. Wenn die automatische Proxyerkennung aktiviert ist, versucht das System, ein Proxy-Konfigurationsskript zu finden, das für die Rückgabe der Proxy-Gruppe verantwortlich ist, die für die Anforderung verwendet werden kann.

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

Elijah Glover
quelle
4
Wie beantwortet dies die Frage? Wie kann das OP diese Informationen nutzen?
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
quelle
5
Es ist vorzuziehen, eine Erklärung Ihrer Lösung zu schreiben und nicht nur die Postleitzahl. Können Sie einen Text bearbeiten, der dem Leser helfen würde?
Brian Tompsett - 莱恩 莱恩
0

Ich werde ein Beispiel verwenden, um die obigen Antworten zu ergänzen.

Beim Versuch, Pakete über das Web Platform Installer zu installieren, sind Proxy-Probleme aufgetreten

Auch hier wird eine Konfigurationsdatei verwendet, die WebPlatformInstaller.exe.config lautet

Ich habe versucht , die Änderungen in vorschlagen dieses IIS - Forum , das ist

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

und

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

Nichts davon hat funktioniert.

Was für mich funktioniert hat war das -

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

Das Modul musste beim Web Platform Installer registriert sein, um es verwenden zu können.

Mukus
quelle