How do I see the raw HTTP request that the HttpWebRequest class sends? How do I see the raw HTTP request that the HttpWebRequest class sends? asp.net asp.net

How do I see the raw HTTP request that the HttpWebRequest class sends?


I realise that this is an old question. @feroze's answer says what to do, but does not go into any detail on how to set up System.Net tracing to achieve it.

As this question was the first Google result for my query into the subject, and as we are all busy people, I thought I would save you all from having to hunt down this information.

System.Web is very powerful for debugging HttpWebRequests and can be easily set up using the web.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>

Adding a simple HttpWebRequest in your code, and running in debugging mode in Visual Studio, the following information will be displayed in the debug console:

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: TrueSystem.Net Verbose: 0 : [6596] Exiting HttpWebRequest#11234::HttpWebRequest() System.Net Verbose: 0 : [6596] Exiting WebRequest::Create()     -> HttpWebRequest#11234System.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#11234System.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::WriteSystem.Net Verbose: 0 : [6596] 00000000 : 3C 73 6F 61 70 3A 45 6E-76 65 6C 6F 70 65 0D 0A : <soap:Envelope.....etc

I found this especially useful when trying to find out the cause of a webservice client error. It turned out I was missing a header.


You can use System.Net tracing mechanism to see the raw HTTP requests sent on the wire. You can also add your own tracelistener to the process.


You can use a network traffic sniffer like wireshark.

This is not a debugging proxy, but will sniff all traffic and let you see the raw requests/responses.