¿Cómo veo la solicitud HTTP sin formato que envía la clase HttpWebRequest?

Resuelto eeeeaaii asked hace 13 años • 9 respuestas

Sé que todos responderán "use un servidor proxy de depuración como Fiddler", pero no es tan simple.

Esta es mi situación: tengo un código que se ejecuta en un servidor, en un código subyacente de una página ASP.NET (aspx.cs), que (entre otras cosas) establece una conexión con otro servidor, toma algunas cosas y luego las formatea. y lo devuelve al navegador.

El problema es que el otro servidor está haciendo algo incorrecto, por lo que quiero poder pasar un indicador de depuración a la página (a través de la cadena de consulta, por ejemplo, ?debug=true) para que imprima el HTTP completamente sin formato. Solicite que se envíe al otro servidor para poder ver qué diablos está mal. Este código se ejecuta en varios lugares, por lo que quiero poder pasar este indicador en desarrollo, preparación o producción y simplemente ver la solicitud, sin tener que averiguar si los servidores de producción pueden comunicarse con algún servidor proxy que exista en algún lugar. , etc.

Pensarías que sería fácil hacer esto, ¿verdad? Entonces me siento como si estuviera loco o algo así, pero miré la referencia de HttpWebRequest y su clase principal WebRequest y... nada. No se puede hacer. Uno pensaría que Microsoft habría pensado en esto. Lo más parecido es que puedes acceder a la colección "Encabezados", pero cuando lo probé, omitió algunos encabezados realmente importantes como "longitud del contenido", por lo que debe estar "mintiéndome" (sé que está mintiendo, porque sé por el hecho de que el servidor remoto está devolviendo un estado 200: la solicitud es exitosa, solo devuelve datos incorrectos/diferentes/incorrectos)

Aquí está el ejemplo de código solicitado:

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();
eeeeaaii avatar Sep 28 '10 04:09 eeeeaaii
Aceptado

Me doy cuenta de que esta es una vieja pregunta. La respuesta de @feroze dice qué hacer, pero no detalla cómo configurar System.Netel seguimiento para lograrlo.

Como esta pregunta fue el primer resultado de Google para mi consulta sobre el tema, y ​​como todos somos personas ocupadas, pensé que les ahorraría a todos tener que buscar esta información.

System.Webes muy poderoso para depurar HttpWebRequestmensajes de correo electrónico y se puede configurar fácilmente usando 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>

Al agregar un simple HttpWebRequesten su código y ejecutarlo en modo de depuración en Visual Studio, se mostrará la siguiente información en la consola de depuración:

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

Esto me resultó especialmente útil al intentar descubrir la causa de un error del cliente de servicio web. Resultó que me faltaba un encabezado.

kamui avatar Sep 05 '2014 10:09 kamui

Puede utilizar el mecanismo de seguimiento de System.Net para ver las solicitudes HTTP sin procesar enviadas por cable. También puedes agregar tu propio tracelistener al proceso.

feroze avatar Sep 28 '2010 03:09 feroze

Puede utilizar un rastreador de tráfico de red como Wireshark .

Este no es un proxy de depuración, pero detectará todo el tráfico y le permitirá ver las solicitudes/respuestas sin procesar.

Oded avatar Sep 27 '2010 21:09 Oded

Respondiendo mi propia pregunta aquí, porque pensé en otra forma de hacerlo. Básicamente, la idea es: volver a dirigir HttpWebRequest a una página que registre la solicitud HTTP sin procesar entrante. En otras palabras, configure un controlador HTTP personalizado según esta publicación del foro:

http://forums.asp.net/t/353955.aspx

Y luego cambie solo la URL en HttpWebRequest para que apunte a este nuevo punto final, pero mantenga todos los demás elementos de la solicitud iguales. Escribe el resultado en un archivo o algo así y listo.

eeeeaaii avatar Oct 06 '2010 15:10 eeeeaaii