168 votes

Enregistrer les messages de demande/réponse lors de l'utilisation de HttpClient

J'ai une méthode qui effectue un POST comme ci-dessous

var response = await client.PostAsJsonAsync(url,entity);

if (response.IsSuccessStatusCode)
{
        // lire la réponse en tant qu'objet fortement typé
        return await response.Content.ReadAsAsync();
}

Ma question est comment puis-je obtenir le JSON réel qui a été posté à partir de l'objet entity. J'aimerais enregistrer le JSON qui est POSTÉ, il serait donc agréable de l'avoir sans que je doive le sérialiser en JSON moi-même.

290voto

Kiran Challa Points 14141

Un exemple de la façon dont vous pourriez le faire:

Quelques notes:

  • LoggingHandler intercepte la demande avant de la transmettre à HttpClientHandler qui écrit finalement sur le fil.

  • L'extension PostAsJsonAsync crée internalement un ObjectContent et lorsque ReadAsStringAsync() est appelé dans le LoggingHandler, cela pousse le formateur à l'intérieur de ObjectContent à sérialiser l'objet et c'est la raison pour laquelle vous voyez le contenu en json.

Manipulateur de journalisation:

public class LoggingHandler : DelegatingHandler
{
    public LoggingHandler(HttpMessageHandler innerHandler)
        : base(innerHandler)
    {
    }

    protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        Console.WriteLine("Demande:");
        Console.WriteLine(request.ToString());
        if (request.Content != null)
        {
            Console.WriteLine(await request.Content.ReadAsStringAsync());
        }
        Console.WriteLine();

        HttpResponseMessage réponse = await base.SendAsync(request, cancellationToken);

        Console.WriteLine("Réponse:");
        Console.WriteLine(response.ToString());
        if (response.Content != null)
        {
            Console.WriteLine(await response.Content.ReadAsStringAsync());
        }
        Console.WriteLine();

        return response;
    }
}

Chaînez le LoggingHandler ci-dessus avec HttpClient:

HttpClient client = new HttpClient(new LoggingHandler(new HttpClientHandler()));
HttpResponseMessage réponse = client.PostAsJsonAsync(baseAddress + "/api/values", "Bonjour, monde!").Résultat;

Sortie:

Demande:
Méthode: POST, RequestUri: 'http://kirandesktop:9095/api/values', Version: 1.1, Contenu: System.Net.Http.ObjectContent`1[
[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], En-têtes:
{
  Content-Type: application/json; charset=utf-8
}
"Bonjour, monde!"

Réponse:
StatusCode: 200, Raison: 'OK', Version: 1.1, Contenu: System.Net.Http.StreamContent, En-têtes:
{
  Date: Ven, 20 Sep 2013 20:21:26 GMT
  Serveur: Microsoft-HTTPAPI/2.0
  Longueur du contenu: 15
  Type de contenu: application/json; charset=utf-8
}
"Bonjour, monde!"

70voto

Rami A. Points 3207

REMARQUE : Cela fonctionne UNIQUEMENT avec le .NET Framework !

Peut fonctionner avec .NET 7+ (https://github.com/dotnet/runtime/issues/23937)


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

Pour configurer un écouteur System.Net pour afficher à la fois sur la console et un fichier journal, ajoutez ce qui suit à votre fichier de configuration d'Assembly :

22voto

Le suivi du réseau est également disponible pour les objets suivants (voir l'article sur msdn)

  • System.Net.Sockets Certains méthodes publiques des classes Socket, TcpListener, TcpClient et Dns
  • System.Net Certaines méthodes publiques des classes HttpWebRequest, HttpWebResponse, FtpWebRequest et FtpWebResponse, ainsi que des informations de débogage SSL (certificats invalides, liste des émetteurs manquante et erreurs de certificat client)
  • System.Net.HttpListener Certaines méthodes publiques des classes HttpListener, HttpListenerRequest et HttpListenerResponse.
  • System.Net.Cache Certaines méthodes privées et internes dans System.Net.Cache.
  • System.Net.Http Certaines méthodes publiques des classes HttpClient, DelegatingHandler, HttpClientHandler, HttpMessageHandler, MessageProcessingHandler et WebRequestHandler.
  • System.Net.WebSockets.WebSocket Certaines méthodes publiques des classes ClientWebSocket et WebSocket.

Placez les lignes de code suivantes dans le fichier de configuration:

-25voto

user1096164 Points 1

La solution la plus simple serait d'utiliser Wireshark et de tracer le flux tcp HTTP.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X