60

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

我正在使用 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
4

6 回答 6

104

您应该能够使用该TryGetValues方法。

HttpHeaders headers = response.Headers;
IEnumerable<string> values;
if (headers.TryGetValues("X-BB-SESSION", out values))
{
  string session = values.First();
}
于 2014-08-22T19:20:58.537 回答
19

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

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

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

于 2019-01-22T14:00:43.547 回答
16

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

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;
于 2016-12-02T20:31:36.377 回答
6

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

    var responseValue = response.Headers.FirstOrDefault(i=>i.Key=="X-BB-SESSION").Value.FirstOrDefault();
于 2018-08-31T14:07:10.427 回答
3

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

于 2014-08-22T18:45:06.817 回答
0

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

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);
        }
于 2019-10-03T21:29:16.637 回答