HttpClient récupérer tous les en-têtes

Actuellement, je travaille sur le wrapper de l’API. Si j’envoie une mauvaise Consumer Key , le serveur renverra le Status 403 Forbidden dans l’en-tête. Il passera également des en-têtes personnalisés. Comment puis-je récupérer ces en-têtes personnalisés?

C’est la réponse reçue du serveur.

 Cache-Control: private Date: Wed, 01 May 2013 14:36:17 GMT P3P: policyref="/w3c/p3p.xml", CP="ALL CURa ADMa DEVa OUR IND UNI COM NAV INT STA PRE" Server: Apache/2.2.23 (Amazon) Status: 403 Forbidden X-Error: Invalid consumer key. X-Error-Code: 152 X-Powered-By: PHP/5.3.20 Connection: keep-alive 

J’ai besoin de récupérer les X-Error-Code X-Error et X-Error-Code . Actuellement, HttpClient classe HttpClient pour traiter la demande. Si je regarde les en-têtes répondre sous Quick Watch dans VS Studio 2012, je pourrais le trouver comme ceci

((System.Net.Http.Headers.HttpHeaders)(response.Headers)).headerStore["X-Error-Code"].ParsedValue

Y a-t-un autre moyen de faire ça?

Edit: headerStore n’est pas accessible via le code car il s’agit d’un champ privé. Je n’y accède que par la fenêtre de surveillance rapide.

Voici mon extrait de code pour la demande:

 var response = await _httpClient.PostAsync("/v3/oauth/request", content); 

HttpResponseMessage.Headers renvoie une référence HttpResponseHeaders , vous devriez donc pouvoir utiliser GetValues()

 ssortingng error = response.Headers.GetValues("X-Error").FirstOrDefault(); ssortingng errorCode = response.Headers.GetValues("X-Error-Code").FirstOrDefault(); 

Puisque le titre de la question est “Récupérer tous les en-têtes”, je voulais append une réponse à ce sujet.

HttpResponseMessage renvoyé par les méthodes HttpClient a deux propriétés d’en-tête:

  • HttpResponseMessage.Headers est un HttpResponseHeaders avec des en-têtes de réponse génériques.
  • HttpResponseMessage.Content.Headers est un HttpContentHeaders avec des en-têtes spécifiques au Content-Type tels que Content-Type

Les deux objects implémentent IEnumerable> , afin que vous puissiez facilement combiner tous les en-têtes avec quelque chose comme:

 var responseMessage = await httpClient.GetAsync(url); var headers = responseMessage.Headers.Concat(responseMessage.Content.Headers); 

Juste un piège que j’ai trouvé en essayant de trouver un en-tête qui n’existait pas. Vous devez utiliser TryGetValues ​​au lieu de GetValues ​​car au moment de l’exécution, une exception sera levée si l’en-tête est introuvable. Vous utiliseriez quelque chose comme ce code:

 IEnumerable cookieHeader; response.Headers.TryGetValues("Set-Cookie", out cookieHeader); 

Cela fonctionne pour moi:

 (Ssortingng[])response.Headers.GetValues("X-Error"))[0]