web-dev-qa-db-ja.com

HttpResponseMessageから特定のヘッダー値を取得する方法

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
31
MikePR

TryGetValues メソッドを使用できるはずです。

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

サムの答えは正しいですが。これはいくらか単純化でき、不必要な変数を回避できます。

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;
6
pim

Linqも同様に使用して、これが解決方法です。

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

きれいで長すぎないと思います。

4
Max_Thom

奇妙なことに、すべてのヘッダーの代わりに1つのヘッダー(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を使用してチェックする方が適切です

3
Igor Kulman

誰かがメソッドベースのクエリが好きなら、あなたは試すことができます:

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