web-dev-qa-db-fra.com

Comment obtenir une valeur d'en-tête spécifique à partir de HttpResponseMessage

Je passe un appel HTTP. Ma réponse contient un code de session X-BB-SESSION dans la section d'en-tête de l'objet HttpResponseMessage. Comment puis-je obtenir cette valeur d'en-tête spécifique?

J'utilise une instruction foreach pour parcourir tous les en-têtes ( lien MSDN ). Cependant, le compilateur n'arrête pas de dire que cela ne peut pas être fait: 

foreach statement cannot operate on variables of type
  System.net.http.headers.cachecontrolheadervalue because
  'System.net.http.headers.cachecontrolheadervalue' doesn't contain
  a public definition for 'GetEnumerator'

C'est le code que j'essaye:

//Connection code to BaasBox

HttpResponseMessage response = await client.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead);
if (response.IsSuccessStatusCode)
{
    //get the headers
    HttpResponseHeaders responseHeadersCollection = response.Headers;
    foreach (var value in responseHeadersCollection.CacheControl)  --> HERE
    {
        string sTemp = String.Format("CacheControl {0}={1}", value.Name, value.Value);
    } else
{
    Console.WriteLine("X-BB-SESSION: NOT Found");
}

Le contenu de l'en-tête d'où j'essaie d'obtenir la valeur (X-BB-SESSION valeur) ressemble à quelque chose comme:

Access-Control-Allow-Origin: *    
Access-Control-Allow-Headers: X-Requested-With    
X-BB-SESSION: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
25
MikePR

Vous devriez pouvoir utiliser la méthode TryGetValues .

HttpHeaders headers = response.Headers;
IEnumerable<string> values;
if (headers.TryGetValues("X-BB-SESSION", out values))
{
  string session = values.First();
}
52
Sam Harwell

Vous essayez d'énumérer un en-tête (CacheControl) au lieu de tous les en-têtes, ce qui est étrange. Pour voir tous les en-têtes, utilisez

foreach (var value in responseHeadersCollection)
{
    Debug.WriteLine("CacheControl {0}={1}", value.Name, value.Value);
}

pour obtenir un en-tête spécifique, convertissez les en-têtes en dictionnaire et obtenez-en un que vous voulez

Debug.WriteLine(response.Headers.ToDictionary(l=>l.Key,k=>k.Value)["X-BB-SESSION"]);

Cela lève une exception si l'en-tête n'est pas dans le dictionnaire, vous devriez donc le vérifier en utilisant d'abord ContainsKey

3
Igor Kulman

Bien que la réponse de Sam soit correcte. Il peut être quelque peu simplifié et éviter la variable inutile.

IEnumerable<string> values;
string session = string.Empty;
if (response.Headers.TryGetValues("X-BB-SESSION", out values))
{
    session = values.FirstOrDefault();
}
3
pimbrouwers

Si quelqu'un aime les requêtes basées sur des méthodes, alors vous pouvez essayer:

    var responseValue = response.Headers.FirstOrDefault(i=>i.Key=="X-BB-SESSION").Value.FirstOrDefault();
1
Izi

En utilisant Linq aussi, voici comment je l'ai résolu.

string operationLocation = response.Headers.GetValues("Operation-Location").FirstOrDefault();

Je pense que c'est propre et pas trop long. 

0
Max_Thom