c# - Cómo obtener un valor de encabezado específico de HttpResponseMessage
windows-phone-8 httpclient (4)
Aunque la respuesta de Sam es correcta. Puede ser algo simplificado, y evitar la variable innecesaria.
IEnumerable<string> values;
string session = string.Empty;
if (response.Headers.TryGetValues("X-BB-SESSION", out values))
{
session = values.FirstOrDefault();
}
Estoy haciendo una llamada HTTP. Mi respuesta contiene un código de sesión X-BB-SESSION
en la sección del encabezado del objeto HttpResponseMessage
. ¿Cómo obtengo ese valor de encabezado específico?
Estoy usando una instrucción foreach para iterar a través de todos los encabezados ( enlace MSDN ). Sin embargo, el compilador sigue diciendo que no se puede hacer:
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''
Este es el código que estoy intentando:
//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");
}
El contenido del encabezado de donde estoy tratando de obtener el valor (valor X-BB-SESSION
) es algo como:
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
X-BB-SESSION: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Debería poder utilizar el método TryGetValues
.
HttpHeaders headers = response.Headers;
IEnumerable<string> values;
if (headers.TryGetValues("X-BB-SESSION", out values))
{
string session = values.First();
}
Está intentando enumerar un encabezado (CacheControl) en lugar de todos los encabezados, lo que es extraño. Para ver todos los encabezados, use
foreach (var value in responseHeadersCollection)
{
Debug.WriteLine("CacheControl {0}={1}", value.Name, value.Value);
}
para obtener un encabezado específico, convierta los encabezados en un diccionario y luego obtenga el que desee
Debug.WriteLine(response.Headers.ToDictionary(l=>l.Key,k=>k.Value)["X-BB-SESSION"]);
Esto generará una excepción si el encabezado no está en el diccionario, por lo que es mejor que lo compruebe con ContainsKey primero.
Si a alguien le gustan las consultas basadas en métodos, puede probar:
var responseValue = response.Headers.FirstOrDefault(i=>i.Key=="X-BB-SESSION").Value.FirstOrDefault();