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
TryGetValues
メソッドを使用できるはずです。
HttpHeaders headers = response.Headers;
IEnumerable<string> values;
if (headers.TryGetValues("X-BB-SESSION", out values))
{
string session = values.First();
}
サムの答えは正しいですが。これはいくらか単純化でき、不必要な変数を回避できます。
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;
Linqも同様に使用して、これが解決方法です。
string operationLocation = response.Headers.GetValues("Operation-Location").FirstOrDefault();
きれいで長すぎないと思います。
奇妙なことに、すべてのヘッダーの代わりに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を使用してチェックする方が適切です
誰かがメソッドベースのクエリが好きなら、あなたは試すことができます:
var responseValue = response.Headers.FirstOrDefault(i=>i.Key=="X-BB-SESSION").Value.FirstOrDefault();