web-dev-qa-db-fra.com

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

Actuellement, je travaille sur le wrapper de l'API. Si j'envoie un Consumer Key incorrect, le serveur renverra Status sous la forme 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 le X-Error et le X-Error-Code. Actuellement, j'utilise la 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 ai accès 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);
17
Shulhi Sapli

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

string error = response.Headers.GetValues("X-Error").FirstOrDefault();
string errorCode = response.Headers.GetValues("X-Error-Code").FirstOrDefault();
34
Jon Skeet

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

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

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

Les deux objets implémentent IEnumerable<KeyValuePair<string, IEnumerable<string>>, vous pouvez donc 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);
11
Nick

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<string> cookieHeader; 
response.Headers.TryGetValues("Set-Cookie", out cookieHeader);
8
Cameron Tinker

Cela fonctionne pour moi:

(String[])response.Headers.GetValues("X-Error"))[0]
1
nmishr