【问题标题】:How to get an specific header value from the HttpResponseMessage如何从 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 但是,相同的代码在此之前一直在工作(以获得特定的标题)

标签: c# windows-phone-8 httpclient httpresponse baasbox


【解决方案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);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 2020-08-11
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 2023-03-08
      相关资源
      最近更新 更多