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

本文关键字:报头 获取 HttpResponseMessage | 更新日期: 2023-09-27 18:19:00

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

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

您应该能够使用TryGetValues方法。

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

我也是用Linq来解决这个问题的

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

我认为它干净,不太长。

虽然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;

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

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

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

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

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