¿Cómo veo la solicitud HTTP sin formato que envía la clase HttpWebRequest?
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();
Me doy cuenta de que esta es una vieja pregunta. La respuesta de @feroze dice qué hacer, pero no detalla cómo configurar System.Net
el 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.Web
es muy poderoso para depurar HttpWebRequest
mensajes 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 HttpWebRequest
en 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.
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.
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.
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.