Wie erstelle ich einen einfachen Proxy in C #?

Ich habe Privoxy vor ein paar Wochen heruntergeladen und zum Spaß war ich neugierig zu wissen, wie eine einfache Version davon gemacht werden kann.

Ich verstehe, dass ich den Browser (Client) konfigurieren muss, um eine Anfrage an den Proxy zu senden. Der Proxy sendet die Anfrage an das Web (sagen wir, es ist ein HTTP-Proxy). Der Proxy wird die Antwort erhalten … aber wie kann der Proxy die Anfrage an den Browser (Client) zurücksenden?

Ich habe im Internet nach C # und http-Proxy gesucht, aber nichts gefunden, was mich verstehen lässt, wie es hinter der Szene richtig funktioniert. (Ich glaube, ich möchte keinen Reverse-Proxy, aber ich bin mir nicht sicher).

Hat jemand von euch irgendeine Erklärung oder Informationen, die mir erlauben, dieses kleine Projekt fortzusetzen?

Aktualisieren

Das verstehe ich (siehe Grafik unten).

Schritt 1 Ich konfiguriere den Client (Browser) für alle zu sendenden Anfragen an 127.0.0.1 am Port des Proxies listen. Auf diese Weise wird die Anfrage nicht direkt an das Internet gesendet, sondern vom Proxy verarbeitet.

Schritt2 Der Proxy sieht eine neue Verbindung, liest den HTTP-Header und sieht die Anfrage, die er ausführen muss. Er führt die Anfrage aus.

Schritt 3 Der Proxy erhält eine Antwort von der Anfrage. Jetzt muss er die Antwort aus dem Web an den Kunden senden, aber wie?

Alt-Text

Nützlicher Link

Mentalis Proxy : Ich habe dieses Projekt gefunden, das ein Proxy ist (aber mehr, das ich gerne hätte). Ich könnte die Quelle überprüfen, aber ich wollte wirklich etwas Grundlegendes, um mehr das Konzept zu verstehen.

ASP Proxy : Ich könnte vielleicht auch hier einige Informationen bekommen.

Reflektor anfordern : Dies ist ein einfaches Beispiel.

Hier ist ein Git Hub Repository mit einem einfachen HTTP-Proxy .

Solutions Collecting From Web of "Wie erstelle ich einen einfachen Proxy in C #?"

Sie können einen mit der HttpListener class HttpListener , um auf eingehende Anforderungen zu HttpWebRequest , und die HttpWebRequest class, um die Anforderungen HttpWebRequest .

Ich würde nicht HttpListener oder etwas ähnliches verwenden, auf diese Weise werden Sie auf so viele Probleme stoßen.

Am wichtigsten wird es ein großer Schmerz sein zu unterstützen:

  • Proxy-Keep-Alive
  • SSL funktioniert nicht (auf korrekte Weise erhalten Sie Popups)
  • .NET-Bibliotheken folgen strikt den RFCs, was dazu führt, dass einige Anforderungen fehlschlagen (obwohl IE, FF und alle anderen Browser der Welt funktionieren).

Was Sie tun müssen, ist:

  • Hören Sie einen TCP-Port
  • Parsen Sie die Browser-Anfrage
  • Extract Host stellt eine Verbindung zu diesem Host in TCP-Ebene her
  • Leiten Sie alles hin und her, es sei denn Sie möchten benutzerdefinierte Header usw. hinzufügen

Ich habe 2 verschiedene HTTP-Proxies in .NET mit unterschiedlichen Anforderungen geschrieben und kann Ihnen sagen, dass dies der beste Weg ist.

Mentalis macht das, aber ihr Code ist “Delegate Spaghetti”, schlimmer als GoTo 🙂

Proxy kann folgendermaßen funktionieren.

Step1, konfigurieren Sie den Client für die Verwendung von proxyHost: proxyPort.

Proxy ist ein TCP-Server, der auf proxyHost: proxyPort abhört. Der Browser öffnet die Verbindung mit Proxy und sendet eine HTTP-Anfrage. Proxy analysiert diese Anforderung und versucht, den Header “Host” zu erkennen. Dieser Header teilt Proxy mit, wo die Verbindung geöffnet werden soll.

Schritt 2: Proxy öffnet die Verbindung zu der im Header “Host” angegebenen Adresse. Dann sendet es eine HTTP-Anfrage an diesen entfernten Server. Liest die Antwort.

Schritt 3: Nachdem die Antwort vom Remote-HTTP-Server gelesen wurde, sendet Proxy die Antwort über eine zuvor geöffnete TCP-Verbindung mit dem Browser.

Schematisch wird es so aussehen:

 Browser Proxy HTTP server Open TCP connection Send HTTP request -----------> Read HTTP header detect Host header Send request to HTTP -----------> Server < ----------- Read response and send <----------- it back to the browser Render content 

Ich habe kürzlich einen leichten Proxy in c # .net mit TcpListener und TcpClient geschrieben .

https://github.com/titanium007/Titanium-Web-Proxy

Es unterstützt sicheres HTTP auf die korrekte Weise, Clientcomputer müssen dem vom Proxy verwendeten Stammzertifikat vertrauen. Unterstützt auch WebSockets-Relay. Alle functionen von HTTP 1.1 werden unterstützt, mit Ausnahme von Pipelining. Pipelining wird sowieso von den meisten modernen Browsern nicht verwendet. Unterstützt auch Windows-Authentifizierung (Plain, Digest).

Sie können Ihre Anwendung verknüpfen, indem Sie auf das Projekt verweisen und dann den gesamten Datenverkehr anzeigen und ändern. (Anfrage und Antwort).

Was die performance anbelangt, habe ich es auf meinem Rechner getestet und funktioniert ohne nennenswerte Verzögerung.

Wenn Sie nur den Datenverkehr abfangen möchten, können Sie den Fiddler-Core verwenden, um einen Proxy zu erstellen …

http://fiddler.wikidot.com/fiddlercore

Führen Sie Fiddler zuerst mit der Benutzeroberfläche aus, um zu sehen, was es tut, es ist ein Proxy, mit dem Sie den http / https-Verkehr debuggen können. Es ist in c # geschrieben und hat einen core, den Sie in Ihre eigenen Anwendungen einbauen können.

Beachten Sie, dass FiddlerCore nicht für kommerzielle Anwendungen frei ist.

Mit OWIN und WebAPI sind die Dinge wirklich einfach geworden. Bei meiner Suche nach einem C # -Proxy-Server stieß ich auch auf diesen Beitrag http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ . Dies wird der Weg sein, den ich nehme.

Stimme zu dr evil, wenn du HTTPListener verwendest, wirst du viele Probleme haben, du musst Anfragen analysieren und wirst mit Kopfzeilen und …

  1. Verwenden Sie den tcp-Listener, um Browseranforderungen zu hören
  2. Analysieren Sie nur die erste Zeile der Anforderung, und rufen Sie die Hostdomäne und den Port für die Verbindung ab
  3. Senden Sie die genaue Raw-Anfrage an den gefundenen Host in der ersten Zeile der Browser-Anfrage
  4. empfange die Daten von der Zielseite (Ich habe ein Problem in diesem Abschnitt)
  5. sende die exakten vom Host empfangenen Daten an den Browser

Sie sehen, Sie müssen nicht einmal wissen, was ist in der Browser-Anfrage und analysieren es, nur erhalten die Ziel-Website-Adresse aus der ersten Zeile in der Regel mag dies GET http://google.com HTTP1.1 oder CONNECT facebook.com: 443 (dies ist für SSL-Anfragen)

Socks4 ist ein sehr einfaches zu implementierendes Protokoll. Sie hören auf die erste Verbindung, stellen eine Verbindung zu dem Host / Port her, der vom Client angefordert wurde, senden den Erfolgscode an den Client und leiten die ausgehenden und eingehenden Datenströme über die Sockets weiter.

Wenn Sie mit HTTP gehen, müssen Sie einige HTTP-Header lesen und möglicherweise setzen / entfernen, damit es ein wenig mehr Arbeit ist.

Wenn ich mich richtig erinnere, funktioniert SSL über HTTP- und Socks-Proxies. Für einen HTTP-Proxy implementieren Sie das CONNECT-Verb, das ähnlich wie socks4 wie oben beschrieben funktioniert. Dann öffnet der Client die SSL-Verbindung über den Proxy-TCP-Stream.

Der Browser ist mit dem Proxy verbunden, so dass die Daten, die der Proxy vom Webserver erhält, nur über die gleiche Verbindung gesendet werden, die der Browser an den Proxy initiierte.

Ich habe auch einen einfachen, aber leistungsfähigen Reverse Proxy für asp.net / web api geschrieben.

Sie können es hier finden: https://github.com/SharpTools/SharpReverseProxy

Fügen Sie einfach über nuget zu Ihrem Projekt hinzu und Sie können loslegen. Sie können sogar spontan die Anfrage oder die Antwort ändern oder eine Weiterleitung aufgrund eines Authentifizierungserrorss ablehnen.

Schauen Sie sich den Quellcode an, es ist wirklich einfach zu implementieren 🙂