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

Posted

技术标签:

【中文标题】如何从 HttpResponseMessage 中获取特定的标头值【英文标题】:How to get an specific header value from the HttpResponseMessage 【发布时间】:2014-08-22 04:12:21 【问题描述】:

我正在进行 HTTP 调用。我的响应在HttpResponseMessage 对象的标题部分中包含会话代码X-BB-SESSION。如何获取特定的标头值?

我正在使用 foreach 语句遍历所有标题 (MSDN link)。但是编译器一直说它无法完成:

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吗? 可能是 WP 8 或 WP 8.1 当我开始做测试时,它是在 WP8 中。现在有了自动更新,我有 WP 8.1 但是,相同的代码在此之前一直在工作(以获得特定的标题) 【参考方案1】:

您应该可以使用TryGetValues 方法。

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

  string session = values.First();

【讨论】:

注意:First() 是扩展方法;包括 System.Linq 以访问它。 而不是IEnumberable&lt;string&gt;,我需要使用Microsoft.Extensions.Primitives.StringValues【参考方案2】:

也使用 Linq,这就是我解决它的方法。

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

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

【讨论】:

请注意,如果找不到标头,这将引发异常。如果这是你想要的,你也可以使用 First() 而不是 FirstOrDefault()。【参考方案3】:

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

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;

【讨论】:

如果你走那条路,那么你可以再删除 1 个变量:response.Headers.TryGetValues("X-BB-SESSION", out var values) @GuillaumePerrot 你是对的。但是这是在 c# 7 中添加的,所以我使用“旧”方式来兼容。 一路走,使用:string session = response.Headers.TryGetValues("X-BB-SESSION", out var values) ? values.FirstOrDefault() : null; 对我来说完美无缺【参考方案4】:

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

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

【讨论】:

【参考方案5】:

您试图枚举一个标头 (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 进行检查

【讨论】:

嗨,伊戈尔。我也测试了你的代码,它可以工作。我只是想出了另一个获得相同价值的替代方案。谢谢! 可能类似于 Debug.WriteLine(response.Headers.FirstOrDefault(k=>k.Key == "X-BB-SESSION")?.Value.FirstOrDefault()); "...将标题转换为字典..." 请参阅 dotnetcodr.com/2014/03/13/…【参考方案6】:

下面的代码块给出了响应标头的格式化视图

WebRequest 请求 = WebRequest.Create("https://-------.com"); WebResponse 响应 = 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);
        

【讨论】:

以上是关于如何从 HttpResponseMessage 中获取特定的标头值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 HTTPResponseMessage 下载文件

如何从HttpResponseMessage获取特定的标头值

如何从 javascript 中的 C# HttpResponseMessage 读取内容?

在内容 100% 完成之前从 HttpResponseMessage 读取标头

无法从 HttpResponseMessage 中的发布请求中获得响应

C# 从 HttpResponseMessage 读取