如何从HttpResponseMessage中获取特定的头部值

77

我正在进行一个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

你是不是指的是Windows Phone 8.1? - Chubosaurus Software
可以是WP 8或WP 8.1。当我开始进行测试时,它是在WP8中。现在随着自动更新,我有了WP 8.1。然而,同样的代码一直在工作(获取特定标题)直到这个点。 - MikePR
6个回答

126
你应该能够使用TryGetValues方法。
HttpHeaders headers = response.Headers;
IEnumerable<string> values;
if (headers.TryGetValues("X-BB-SESSION", out values))
{
  string session = values.First();
}

11
注意:First() 是一个扩展方法;需要包含 System.Linq 才能访问它。 - BobbyA
我需要使用 Microsoft.Extensions.Primitives.StringValues 而不是 IEnumberable<string> - Jesse Q
如果“X-BB-SESSION”不存在会发生什么? - Shilan
@Shilan 在这种情况下,“TryGetValues”将返回false,而“if”将不会被执行。 - Manuel Hoffmann

28

使用 Linq,这是我解决它的方式。

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

我认为这很干净,而且不会太长。


2
请注意,如果未找到标题,则会引发异常。如果这正是您想要的,那么最好使用First()而不是FirstOrDefault()。 - Sergey Slepov
如果“Operation-Location”不可用,FirstOrDefault();将抛出异常。 - Yawar Murtaza

25

虽然Sam的答案是正确的,但可以进行一定程度的简化,并避免不必要的变量。

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;

2
如果你选择这条路线,那么你可以再移除一个变量:response.Headers.TryGetValues("X-BB-SESSION", out var values) - Guillaume Perrot
1
@GuillaumePerrot 您说得对。但是这是在C# 7中添加的,所以我使用了“旧”的方式以确保兼容性。 - pim
4
为了完整地执行此项操作,请使用以下代码:string session = response.Headers.TryGetValues("X-BB-SESSION", out var values) ? values.FirstOrDefault() : null; - Sergey Slepov
1
对我来说运行得非常完美。 - eugene.polschikov

7

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

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

4
您正尝试枚举一个标题(CacheControl)而不是所有标题,这很奇怪。要查看所有标题,请使用:getAllResponseHeaders()
foreach (var value in responseHeadersCollection)
{
    Debug.WriteLine("CacheControl {0}={1}", value.Name, value.Value);
}

要获取一个特定的头部信息,需要将Headers转换成字典,然后获取你想要的那个。
Debug.WriteLine(response.Headers.ToDictionary(l=>l.Key,k=>k.Value)["X-BB-SESSION"]);

如果字典中没有该标题,则会引发异常,因此最好先使用ContainsKey进行检查。

嗨,Igor。我也测试了你的代码,它可以正常工作。我刚刚想到了另一种获取相同值的替代方法。谢谢! - MikePR
1
也许可以这样写:Debug.WriteLine(response.Headers.FirstOrDefault(k=>k.Key == "X-BB-SESSION")?.Value.FirstOrDefault()); - Sean
"...将标题转换为字典..." 请参见 https://dotnetcodr.com/2014/03/13/extension-methods-in-net-part-3-mixture-of-useful-methods/ - sscheider

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接