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

Mik*_*ePR 34 c# httpresponse httpclient windows-phone-8 baasbox

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

我正在使用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'
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试的代码:

//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");
}
Run Code Online (Sandbox Code Playgroud)

从我试图获取值(X-BB-SESSION值)的标题内容是这样的:

Access-Control-Allow-Origin: *    
Access-Control-Allow-Headers: X-Requested-With    
X-BB-SESSION: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)

Sam*_*ell 68

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

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

  • 注意:First()是一种扩展方法; 包括System.Linq以访问它. (6认同)

小智 7

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

    var responseValue = response.Headers.FirstOrDefault(i=>i.Key=="X-BB-SESSION").Value.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)


rob*_*pim 6

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

IEnumerable<string> values;
string session = string.Empty;
if (response.Headers.TryGetValues("X-BB-SESSION", out values))
{
    session = values.FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)

或者,使用带有三元运算符的单个语句(如@SergeySlepov所述):

string session = response.Headers.TryGetValues("X-BB-SESSION", out var values) ? values.FirstOrDefault() : null;
Run Code Online (Sandbox Code Playgroud)

  • 要一路走下去,请使用:`string session = response.Headers.TryGetValues("X-BB-SESSION", out var values) ? values.FirstOrDefault() : null;` (3认同)
  • 如果走那条路线,那么您可以再删除1个变量:`response.Headers.TryGetValues(“ X-BB-SESSION”,不包含var值)` (2认同)

Max*_*hom 5

同样使用Linq,这就是我解决的方法。

string operationLocation = response.Headers.GetValues("Operation-Location").FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

我认为这很干净,而且时间也不长。

  • 请注意,如果未找到标头,这将引发异常。如果这就是您想要的,您也可以使用 First() 而不是 FirstOrDefault()。 (2认同)