Ich weiß, dass Sie alle antworten werden "Verwenden Sie einen Debugging-Proxy-Server wie Fiddler", aber es ist nicht so einfach.
Hier ist meine Situation: Ich habe Code, der auf einem Server in einer ASP.NET-Seite Code-Behind (aspx.cs) ausgeführt wird, der (unter anderem) eine Verbindung zu einem anderen Server herstellt, einige Dinge abruft und diese dann formatiert und gibt es an den Browser zurück.
Das Problem ist, dass der andere Server das Falsche tut und ich daher in der Lage sein möchte, ein Debugging-Flag an die Seite zu übergeben (über die Abfragezeichenfolge, z. B.? Debug = true), damit das vollständig rohe HTTP ausgedruckt wird Bitten Sie darum, dass es an den anderen Server gesendet wird, damit ich sehen kann, was zum Teufel falsch ist. Dieser Code wird an mehreren Stellen ausgeführt, daher möchte ich dieses Flag nur für Entwickler, Staging oder Produktion übergeben und nur die Anforderung anzeigen können, ohne herausfinden zu müssen, ob die Produktionsserver mit einem irgendwo vorhandenen Proxyserver kommunizieren können , usw.
Sie würden denken, dass es einfach wäre, dies zu tun, oder? Ich fühle mich also verrückt oder so, aber ich habe mir die Referenz für HttpWebRequest und die übergeordnete Klasse WebRequest angesehen und - nichts. Geht nicht. Sie würden denken, Microsoft hätte daran gedacht. Das Nächste ist, dass Sie auf die "Headers" -Sammlung zugreifen können, aber als ich es ausprobiert habe, wurden einige wirklich wichtige Header wie "content length" weggelassen - also muss es mich "anlügen" (ich weiß, dass es lügt, weil ich es weiß für die Tatsache, dass der Remote-Server einen 200-Status zurückgibt - die Anforderung ist erfolgreich, es werden nur schlechte / andere / falsche Daten zurückgegeben)
Hier ist das angeforderte Codebeispiel:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.whatever.com");
req.Method = ... whatever ...;
... other setup for the request ...
/* At this point we are about to send the request.
What does the raw HTTP request look like? */
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Antworten:
Sie können den System.Net-Ablaufverfolgungsmechanismus verwenden, um die auf der Leitung gesendeten HTTP-Rohanforderungen anzuzeigen. Sie können dem Prozess auch Ihren eigenen Tracelistener hinzufügen.
quelle
Mir ist klar, dass dies eine alte Frage ist. Die Antwort von @ feroze sagt aus, was zu tun ist, geht jedoch nicht ins Detail, wie die
System.Net
Ablaufverfolgung eingerichtet werden soll , um dies zu erreichen.Da diese Frage das erste Google-Ergebnis für meine Anfrage zum Thema war und wir alle beschäftigt sind, dachte ich, ich würde Sie alle davor bewahren, diese Informationen suchen zu müssen.
System.Web
ist sehr leistungsfähig zum DebuggenHttpWebRequest
s und kann einfach eingerichtet werden mitweb.config
:<configuration> <system.diagnostics> <trace autoflush="true" /> <sources> <source name="System.Net" maxdatasize="1024"> <listeners> <add name="MyTraceFile"/> <add name="MyConsole"/> </listeners> </source> </sources> <sharedListeners> <add name="MyTraceFile" type="System.Diagnostics.TextWriterTraceListener" initializeData="System.Net.trace.log" /> <add name="MyConsole" type="System.Diagnostics.ConsoleTraceListener" /> </sharedListeners> <switches> <add name="System.Net" value="Verbose" /> </switches> </system.diagnostics> </configuration>
Wenn Sie einen einfachen
HttpWebRequest
Code hinzufügen und im Debugging-Modus in Visual Studio ausgeführt werden, werden die folgenden Informationen in der Debug-Konsole angezeigt:System.Net Verbose: 0 : [6596] WebRequest::Create(https://example.com/service.asmx) System.Net Verbose: 0 : [6596] HttpWebRequest#62063506::HttpWebRequest(https://example.com/service.asmx#11234) System.Net Information: 0 : [6596] RAS supported: True System.Net Verbose: 0 : [6596] Exiting HttpWebRequest#11234::HttpWebRequest() System.Net Verbose: 0 : [6596] Exiting WebRequest::Create() -> HttpWebRequest#11234 System.Net Verbose: 0 : [6596] HttpWebRequest#11234 ::GetRequestStream() System.Net Verbose: 0 : [6596] ServicePoint#11234 ::ServicePoint(example.com:443) System.Net Information: 0 : [6596] Associating HttpWebRequest#11234with ServicePoint#11234 System.Net Information: 0 : [6596] Associating Connection#11234 with HttpWebRequest#11234 System.Net Information: 0 : [6596] Connection#11234 - Created connection from x.x.x.x:xx to x.x.x.x:xx. System.Net Information: 0 : [6596] TlsStream#11234 ::.ctor(host=example.com, #certs=0) System.Net Information: 0 : [6596] Associating HttpWebRequest#11234 with ConnectStream#11234 System.Net Verbose: 0 : [6596] Exiting HttpWebRequest#11234 ::GetRequestStream() -> ConnectStream#11234 System.Net Verbose: 0 : [6596] ConnectStream#7740977::Write() System.Net Verbose: 0 : [6596] Data from ConnectStream#11234::Write System.Net Verbose: 0 : [6596] 00000000 : 3C 73 6F 61 70 3A 45 6E-76 65 6C 6F 70 65 0D 0A : <soap:Envelope.. ...etc
Ich fand dies besonders nützlich, wenn ich versuchte, die Ursache eines Webservice-Client-Fehlers herauszufinden. Es stellte sich heraus, dass mir ein Header fehlte.
quelle
<add name="MyTraceFile" type="System.Diagnostics.TextWriterTraceListener" initializeData="System.Net.trace.log" traceOutputOptions="DateTime" />
Sie können einen Netzwerkverkehrs-Sniffer wie Wireshark verwenden .
Dies ist kein Debugging-Proxy, sondern überwacht den gesamten Datenverkehr und lässt Sie die unformatierten Anforderungen / Antworten sehen.
quelle
localhost
Datenverkehr erfasst . Verwenden Sie stattdessen ein Tool namens RawCap , um den lokalen Host- Verkehr in einer Datei zu erfassen und ihn dann mit Wireshark zu analysieren.Ich beantworte hier meine eigene Frage, weil ich mir einen anderen Weg überlegt habe. Grundsätzlich besteht die Idee darin, dass Sie die HttpWebRequest erneut auf eine Seite verweisen, auf der die eingehende HTTP-Rohanforderung protokolliert wird. Mit anderen Worten, richten Sie einen benutzerdefinierten HTTP-Handler gemäß diesem Forumsbeitrag ein:
http://forums.asp.net/t/353955.aspx
Ändern Sie dann nur die URL in der HttpWebRequest, um auf diesen neuen Endpunkt zu verweisen. Behalten Sie jedoch alle anderen Elemente der Anforderung bei. Schreiben Sie das Ergebnis in eine Datei oder etwas und Sie sind golden.
quelle
Ich empfehle Ihnen, Telerik Fiddler herunterzuladen , um eingehenden / ausgehenden Verkehr zu erfassen.
Hier ist ein einfaches Beispiel, wie es mit diesem Tool gemacht wird:
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich befand mich in einer schwierigen Situation, in der ich die Anwendungskonfigurationsdatei nicht kontrollierte. Daher brauchte ich eine einfache Möglichkeit, die Ablaufverfolgung über Code zu aktivieren und dann problemlos auf die unformatierten Anforderungs- / Antwortdaten in einem zuzugreifen Veranstaltung. Also habe ich diese benutzerdefinierte Klasse, HttpRawTraceListener, zusammengestellt, die für andere in meiner Position von Nutzen sein könnte:
https://github.com/jhilgeman/HttpRawTraceListener/blob/master/HttpRawTraceListener.cs
Es wurde so einfach gestaltet, dass Sie die Datei zu Ihrem Projekt hinzufügen und dann Folgendes aufrufen:
... um die Ablaufverfolgung zu starten. Von dort werden Anforderungen / Antworten aus den Ablaufverfolgungsnachrichten analysiert und dann über das System.Diagnostics.HttpRawTraceListener.FinishedCommunication- Ereignis verfügbar gemacht .
Es ist wahrscheinlich nicht zu 100% perfekt für jedes Szenario (z. B. kein Proxy, sodass beispielsweise keine Webanforderungen von einem Browser erfasst werden), aber es funktioniert ziemlich gut zum Erfassen von HttpWebRequests-Anforderungen / -Antworten auf Webdienste Seien Sie ein guter Ausgangspunkt, wenn Sie so etwas brauchen.
quelle
initialized()
HttpRawTraceListener
und auch Setup,FinishedCommunication
aber wenn ich ausführe, wirdHttpClient().PostAsync()
nichts abgefangen: / Ich verwende .net Framework 4.6.1Ein weiterer Vorschlag. Implementieren Sie Ihren eigenen Webproxy und legen Sie Ihre Anforderung für die Verwendung mit WebRequest.Proxy fest . Dann sollten Sie in der Lage sein, den Datenverkehr aus der Proxy-Instanz zu extrahieren.
Bearbeiten: Update für Links.
quelle
Sie sagen, dass Sie glauben, dass .NET Sie anlügt, und das konkrete Beispiel, das Sie geben, ist, dass der Header
Content-Length
in der HTTP-Antwort fehlt.Der Header
Content-Length
wird jedoch nicht für eine HTTP-Antwort benötigt. Wenn sich der Hauptteil der Antwort in einer Dynamik befindet und seine Länge nicht im Voraus bekannt ist, ist es sehr wahrscheinlich, dass derContent-Length
Header weggelassen wird!quelle
Content-Length
darf unter bestimmten Umständen NICHT angegeben werden, auch nicht bei Verwendung der Chunked-Transfer-Codierung. Ist der Zielserver HTTP / 1.1-fähig?