如何从 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
107636 次浏览

您正在尝试枚举一个头(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"]);

如果标头不在字典中,这将引发异常,因此您最好首先使用 ContainsKey 检查它

您应该能够使用 TryGetValues方法。

HttpHeaders headers = response.Headers;
IEnumerable<string> values;
if (headers.TryGetValues("X-BB-SESSION", out values))
{
string session = values.First();
}

虽然山姆的答案是正确的,但是它可以稍微简化,避免不必要的变量。

IEnumerable<string> values;
string session = string.Empty;
if (response.Headers.TryGetValues("X-BB-SESSION", out values))
{
session = values.FirstOrDefault();
}

或者,使用带有三元运算符的单个语句(如@SergeySlepov 所注释的) :

string session = response.Headers.TryGetValues("X-BB-SESSION", out var values) ? values.FirstOrDefault() : null;

如果有人喜欢基于方法的查询,那么您可以尝试:

    var responseValue = response.Headers.FirstOrDefault(i=>i.Key=="X-BB-SESSION").Value.FirstOrDefault();

利用 Linq 我就是这么解决的。

string operationLocation = response.Headers.GetValues("Operation-Location").FirstOrDefault();

我觉得很干净,而且不会太长。

下面的代码块提供了响应头的格式化视图

WebRequest request = WebRequest. Create (“ https://-------.com”) ; WebResponse response = request. GetResponse () ;

        foreach (var headerItem in response.Headers)
{


IEnumerable<string> values;
string HeaderItemValue="";
values = response.Headers.GetValues(headerItem.ToString());


foreach (var valueItem in values)
{
HeaderItemValue = HeaderItemValue + valueItem + ";";
}


Console.WriteLine(headerItem + " : " + HeaderItemValue);
}