Ich mache einen HTTP-Anruf. Meine Antwort enthält einen Sitzungscode X-BB-SESSION
im Kopfabschnitt des HttpResponseMessage
-Objekts. Wie erhalte ich diesen bestimmten Header-Wert?
Ich verwende eine foreach-Anweisung, um alle Header ( MSDN link ) zu durchlaufen. Der Compiler sagt jedoch immer, dass es nicht möglich ist:
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'
Dies ist der Code, den ich versuche:
//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");
}
Der Header-Inhalt, von dem ich versuche, den Wert (X-BB-SESSION
-Wert) abzurufen, sieht so aus:
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
X-BB-SESSION: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Sie sollten die Methode TryGetValues
verwenden können.
HttpHeaders headers = response.Headers;
IEnumerable<string> values;
if (headers.TryGetValues("X-BB-SESSION", out values))
{
string session = values.First();
}
Sie versuchen, einen Header (CacheControl) anstelle aller Header aufzulisten, was seltsam ist. Um alle Header anzuzeigen, verwenden Sie
foreach (var value in responseHeadersCollection)
{
Debug.WriteLine("CacheControl {0}={1}", value.Name, value.Value);
}
um einen bestimmten Header zu erhalten, konvertieren Sie die Header in ein Wörterbuch und erhalten dann einen, den Sie möchten
Debug.WriteLine(response.Headers.ToDictionary(l=>l.Key,k=>k.Value)["X-BB-SESSION"]);
Dadurch wird eine Ausnahme ausgelöst, wenn sich der Header nicht im Wörterbuch befindet. Überprüfen Sie sie daher zuerst mit ContainsKey
Obwohl Sams Antwort richtig ist. Es kann etwas vereinfacht werden und die nicht benötigte Variable vermeiden.
IEnumerable<string> values;
string session = string.Empty;
if (response.Headers.TryGetValues("X-BB-SESSION", out values))
{
session = values.FirstOrDefault();
}
Wenn jemand methodbasierte Abfragen mag, können Sie Folgendes versuchen:
var responseValue = response.Headers.FirstOrDefault(i=>i.Key=="X-BB-SESSION").Value.FirstOrDefault();
Auch mit Linq habe ich es gelöst.
string operationLocation = response.Headers.GetValues("Operation-Location").FirstOrDefault();
Ich denke es ist sauber und nicht zu lang.