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
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();
}
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
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();
}
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();
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.