如何从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(); 
Interesting Posts