web-dev-qa-db-de.com

So erhalten Sie einen bestimmten Header-Wert aus der HttpResponseMessage

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

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();
}
52
Sam Harwell

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

3
Igor Kulman

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();
}
3
pimbrouwers

Wenn jemand methodbasierte Abfragen mag, können Sie Folgendes versuchen:

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

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. 

0
Max_Thom