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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从HttpResponseMessage获取特定的标头值相关的知识,希望对你有一定的参考价值。

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

我使用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
答案

你应该能够使用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();

我觉得它干净而且不太长。

另一答案

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

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;
另一答案

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

另一答案

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

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

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

从 HttpResponseMessage 获取内容/消息

从 HttpResponseMessage 获取内容/消息

如何确定是不是使用 HttpClient 从缓存中完成了 HttpResponseMessage

如何从 HTTPResponseMessage 下载文件

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

异步任务<HttpResponseMessage> 获取 VS HttpResponseMessage 获取