Mensagens de solicitação / resposta de log ao usar o HttpClient

Eu tenho um método que faz um POST como abaixo

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

Minha pergunta é como obter o JSON real que foi lançado do object de entidade. Eu gostaria de registrar o JSON que é POSTED, então seria bom ter isso sem eu ter que fazer um json serializando eu mesmo.

Um exemplo de como você pode fazer isso:

Algumas notas:

  • LoggingHandler intercepta a solicitação antes de LoggingHandler -la para HttpClientHandler que finalmente grava na conexão.

  • PostAsJsonAsync extensão PostAsJsonAsync cria internamente um ObjectContent e quando ReadAsStringAsync() é chamado no LoggingHandler , faz com que o formatador dentro do ObjectContent serialize o object e é por isso que você está vendo o conteúdo no json.

Manipulador 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; } } 

Encadeie o LoggingHandler acima com HttpClient :

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

Saída:

 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!" 

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

Para configurar um ouvinte System.Net para saída para o console e um arquivo de log, adicione o seguinte ao seu arquivo de configuração de assembly:

                   

Rastreamento de rede também disponível para os próximos objects (consulte o artigo sobre msdn )

  • System.Net.Sockets Alguns methods públicos das classs Socket, TcpListener, TcpClient e Dns
  • System.Net Alguns methods públicos das classs HttpWebRequest, HttpWebResponse, FtpWebRequest e FtpWebResponse e informações de debugging SSL (certificados inválidos, lista de emissores ausentes e erros de certificado de cliente).
  • System.Net.HttpListener Alguns methods públicos das classs HttpListener, HttpListenerRequest e HttpListenerResponse.
  • System.Net.Cache Alguns methods particulares e internos no System.Net.Cache.
  • System.Net.Http Alguns methods públicos das classs HttpClient, DelegatingHandler, HttpClientHandler, HttpMessageHandler, MessageProcessingHandler e WebRequestHandler.
  • System.Net.WebSockets.WebSocket Alguns methods públicos das classs ClientWebSocket e WebSocket.

Coloque as próximas linhas de código no arquivo de configuração

                                           

A solução mais fácil seria usar o Wireshark e rastrear o stream HTTP tcp.