Frage

Wir haben eine Hintergrundoperation (Window Service), die wir über einen Proxyserver verwenden möchten.

Grundsätzlich machen wir das:

public WebClient GetWebClient(){
   var webClient = new WebClient();
   webClient.proxy = new WebProxy(Configuration.ProxyHost, Configuration.ProxyPort);

   // add a bunch of headers to the WebClient (sessionids, etc.)

   return webClient;
}

Der Proxy ist einer, den wir selbst mithilfe von FreeProxy konfiguriert haben.

Ich habe die Protokollierung und auf dem Computer, mit dem ich teste, aktiviert und kann bestätigen, dass bei Verwendung in Firefox Anforderungen an den Proxy gesendet werden.

Für den Proxyserver ist keine Authentifizierung erforderlich, außer dass sich die IP in unserem Büro befinden muss (was nach den Firefox-Beweisen vermutlich nicht das Problem ist).

In unserem Hintergrundprozess scheint ich jedoch nicht den Proxy zu verwenden, wenn ich den Webclient verwende:

using(var wc = GetWebClient())
using(var s = wc.OpenRead("someurl"))
using(var sr = new StreamReader(s)){
    return sr.ReadToEnd();
}

Ich erhalte keine Fehler vom Proxy, aber es scheint, als würden wir nur ohne ihn weitermachen, obwohl der Proxy explizit festgelegt wurde.

Die Informationen scheinen in Ordnung zu sein, nur nicht über unseren Proxy.

Fehlt mir etwas, wenn ich einen Proxy mit einem WebClient verwende?

Bearbeiten: Weitere Details. Wenn wir den Proxy-Dienst auf dem Server deaktivieren, erhalten wir eine Ausnahme, dass wir keine Verbindung herstellen können. Es scheint also, dass der Webclient versucht, den Proxy zu erreichen, aber dieser Datenverkehr fließt nicht tatsächlich durch den Proxy.

Inner Exception: SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

War es hilfreich?

Lösung

Es stellt sich heraus, dass FreeProxy keinen HTTPS-Verkehr akzeptiert hat.

Ich denke, der Proxy muss die Arten von Verkehr zurückgeben, die er weiterleiten kann, und wenn dies nicht möglich ist, unternimmt der Webclient nichts.

Die Burp-Suite wurde als Proxy verwendet, da sie HTTPS akzeptieren kann.

http://portswigger.net/burp/

Andere Tipps

Sie müssen entweder Windows für die Verwendung des Proxys standardmäßig konfigurieren oder den Proxy manuell in Ihrem Code festlegen, siehe: http://msdn.microsoft.com/en-us/library/system.net.webclient.proxy (v= VS.100)) .aspx

Soweit ich das beurteilen kann, verwenden Sie die WebClient-Klasse korrekt.Ich kann die folgende Anfrage sehen ...

using(var client = new WebClient())
{
    client.Proxy = new WebProxy("localhost", 8888);
    Console.WriteLine(client.DownloadString("http://www.google.com"));
}

in Fiddler läuft auf meiner lokalen Box.Wenn ich jetzt Fiddler herunterfahre, erhalte ich die WebException:

Unable to connect to the remote server

Mit einer inneren SocketException von:

No connection could be made because the target machine actively refused it 127.0.0.1:8888

Nach alledem denke ich, dass Ihr Proxy wie beabsichtigt funktioniert, aber die ausgehende HTTP-Anforderung nicht protokolliert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top