如何从HttpResponseMessage获取特定的标头值
我正在进行HTTP呼叫。 我的响应在HttpResponseMessage
对象的标题部分中包含会话代码X-BB-SESSION
。 如何获取特定的标头值?
我正在使用foreach语句迭代所有标头( MSDN链接 )。 但是编译器一直说不能这样做:
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'
这是我正在尝试的代码:
//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"); }
从我试图获取值( X-BB-SESSION
值)的标题内容是这样的:
Access-Control-Allow-Origin: * Access-Control-Allow-Headers: X-Requested-With X-BB-SESSION: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
您应该能够使用TryGetValues
方法。
HttpHeaders headers = response.Headers; IEnumerable values; if (headers.TryGetValues("X-BB-SESSION", out values)) { string session = values.First(); }
您试图枚举一个标头(CacheControl)而不是所有标头,这很奇怪。 要查看所有标题,请使用
foreach (var value in responseHeadersCollection) { Debug.WriteLine("CacheControl {0}={1}", value.Name, value.Value); }
获取一个特定的标题,将标题转换为字典然后得到你想要的
Debug.WriteLine(response.Headers.ToDictionary(l=>l.Key,k=>k.Value)["X-BB-SESSION"]);
如果标题不在字典中,这将抛出exception,因此您最好先使用ContainsKey进行检查
虽然山姆的回答是正确的。 它可以稍微简化,并避免不必要的变量。
IEnumerable values; string session = string.Empty; if (response.Headers.TryGetValues("X-BB-SESSION", out values)) { session = values.FirstOrDefault(); }
如果有人喜欢基于方法的查询,那么您可以尝试:
var responseValue = response.Headers.FirstOrDefault(i=>i.Key=="X-BB-SESSION").Value.FirstOrDefault();