c# windows-phone-8 httpclient httpresponse baasbox

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