Registro de mensajes de solicitud / respuesta cuando se utiliza HttpClient

Tengo un método que hace un POST como a continuación

var response = await client.PostAsJsonAsync(url, entity); if (response.IsSuccessStatusCode) { // read the response as strongly typed object return await response.Content.ReadAsAsync(); } 

Mi pregunta es cómo puedo obtener el JSON real que se envió desde el objeto de la entidad. Me gustaría registrar el JSON que se PUBLICA, por lo que sería bueno tenerlo sin tener que hacer una serialización JSON.

Un ejemplo de cómo puedes hacer esto:

Algunas notas:

  • LoggingHandler intercepta la solicitud antes de LoggingHandler a HttpClientHandler que finalmente escribe en el cable.

  • PostAsJsonAsync extensión PostAsJsonAsync crea internamente ObjectContent y cuando se llama a ReadAsStringAsync() en LoggingHandler , hace que el formateador dentro de ObjectContent LoggingHandler el objeto y esa es la razón por la que está viendo el contenido en json.

Manejador de registro:

 public class LoggingHandler : DelegatingHandler { public LoggingHandler(HttpMessageHandler innerHandler) : base(innerHandler) { } protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { Console.WriteLine("Request:"); Console.WriteLine(request.ToString()); if (request.Content != null) { Console.WriteLine(await request.Content.ReadAsStringAsync()); } Console.WriteLine(); HttpResponseMessage response = await base.SendAsync(request, cancellationToken); Console.WriteLine("Response:"); Console.WriteLine(response.ToString()); if (response.Content != null) { Console.WriteLine(await response.Content.ReadAsStringAsync()); } Console.WriteLine(); return response; } } 

Encadena el LoggingHandler anterior con HttpClient :

 HttpClient client = new HttpClient(new LoggingHandler(new HttpClientHandler())); HttpResponseMessage response = client.PostAsJsonAsync(baseAddress + "/api/values", "Hello, World!").Result; 

Salida:

 Request: Method: POST, RequestUri: 'http://kirandesktop:9095/api/values', Version: 1.1, Content: System.Net.Http.ObjectContent`1[ [System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], Headers: { Content-Type: application/json; charset=utf-8 } "Hello, World!" Response: StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Date: Fri, 20 Sep 2013 20:21:26 GMT Server: Microsoft-HTTPAPI/2.0 Content-Length: 15 Content-Type: application/json; charset=utf-8 } "Hello, World!" 

Ver http://mikehadlow.blogspot.com/2012/07/tracing-systemnet-to-debug-http-clients.html

Para configurar un oyente System.Net para enviar a la consola y a un archivo de registro, agregue lo siguiente a su archivo de configuración de ensamblaje:

                   

El rastreo de red también está disponible para los siguientes objetos (vea el artículo en msdn )

  • System.Net.Sockets Algunos métodos públicos de las clases Socket, TcpListener, TcpClient y Dns
  • System.Net Algunos métodos públicos de las clases HttpWebRequest, HttpWebResponse, FtpWebRequest y FtpWebResponse e información de depuración de SSL (certificados no válidos, lista de emisores faltantes y errores de certificado de cliente).
  • System.Net.HttpListener Algunos métodos públicos de las clases HttpListener, HttpListenerRequest y HttpListenerResponse.
  • System.Net.Cache Algunos métodos privados e internos en System.Net.Cache.
  • System.Net.Http Algunos métodos públicos de las clases HttpClient, DelegatingHandler, HttpClientHandler, HttpMessageHandler, MessageProcessingHandler y WebRequestHandler.
  • System.Net.WebSockets.WebSocket Algunos métodos públicos de las clases ClientWebSocket y WebSocket.

Coloque las siguientes líneas de código en el archivo de configuración

                                           

La solución más fácil sería usar Wireshark y rastrear el flujo HTTP tcp.