2013-05-01 14 views
14

Derzeit arbeite ich an API-Wrapper. Wenn ich eine schlechte Consumer Key sende, wird der Server Status als 403 Forbidden in der Kopfzeile zurückgeben. Es werden auch benutzerdefinierte Header übergeben. Wie lade ich diese benutzerdefinierten Header tatsächlich ab?HttpClient alle Header abrufen

Dies ist die Antwort vom Server erhalten.

Cache-Control: private 
Date: Wed, 01 May 2013 14:36:17 GMT 
P3P: policyref="/w3c/p3p.xml", CP="ALL CURa ADMa DEVa OUR IND UNI COM NAV INT STA PRE" 
Server: Apache/2.2.23 (Amazon) 
Status: 403 Forbidden 
X-Error: Invalid consumer key. 
X-Error-Code: 152 
X-Powered-By: PHP/5.3.20 
Connection: keep-alive 

Ich brauche die X-Error und X-Error-Code abzurufen. Derzeit verwende ich die Klasse HttpClient, um die Anfrage zu bearbeiten. Wenn ich die Header unter Schnell Uhr in VS Studio 2012 reagieren sehen, konnte ich es wie dieses finden

((System.Net.Http.Headers.HttpHeaders)(response.Headers)).headerStore["X-Error-Code"].ParsedValue

Gibt es eine andere Möglichkeit, dies zu tun?

Bearbeiten: headerStore ist nicht zugänglich durch Code, da dies private Feld ist. Ich bekomme nur über das Quick Watch-Fenster Zugriff darauf.

Das ist mein Snippet für die Anfrage:

var response = await _httpClient.PostAsync("/v3/oauth/request", content); 

Antwort

28

Nun, HttpResponseMessage.Headers gibt eine HttpResponseHeaders Referenz, so Sie in der Lage sein sollten GetValues()

string error = response.Headers.GetValues("X-Error").FirstOrDefault(); 
string errorCode = response.Headers.GetValues("X-Error-Code").FirstOrDefault(); 
+0

Nein, kann ich nicht tun, wie ich diesen Fehler erhalten würde 'Fehler Indizierung gelten 3Cannot mit [], um einen Ausdruck vom Typ System.Net.Http.Headers.HttpResponseHeaders''. Ich werde meinen Code oben zur besseren Übersicht aktualisieren. –

+0

@ShulhiSapli: Ah - hatte nicht bemerkt, dass es 'HttpClient' war. Wird bearbeiten. –

+0

Wenn Sie mehr Details benötigen, können Sie hier einen Blick darauf werfen, https://github.com/shulhi/PocketNet/blob/dev/PocketNet/PocketNet/Authenticator/PocketOauth.cs –

8

Nur eine Gotcha zu verwenden, die ich gefunden beim Versuch, um eine Kopfzeile zu finden, die nicht existiert. Sie sollten TryGetValues ​​anstelle von GetValues ​​verwenden, da zur Laufzeit eine Ausnahme ausgelöst wird, wenn der Header nicht gefunden wird. Sie wäre so etwas wie dieser Code verwenden:

IEnumerable<string> cookieHeader; 
response.Headers.TryGetValues("Set-Cookie", out cookieHeader); 
10

Da der Titel der Frage „all Header abrufen“, wollte ich eine Antwort in Bezug auf das hinzuzufügen.

Die HttpResponseMessage zurück von HttpClient Methoden hat zwei Kopf Eigenschaften:

  • HttpResponseMessage.Headers ist ein HttpResponseHeaders mit generic-Response-Header
  • HttpResponseMessage.Content.Headers ist ein HttpContentHeaders mit inhaltsspezifischen Header wie Content-Type

Both Objekte implementieren IEnumerable<KeyValuePair<string, IEnumerable<string>>, so können Sie leicht alle th kombinieren e-Header mit etwas wie folgt aus:

var responseMessage = await httpClient.GetAsync(url); 
var headers = responseMessage.Headers.Concat(responseMessage.Content.Headers); 
+0

Dies erzeugt einen sehr komplizierten Typ für die Header-Variable.Wie werden die Daten in eine Zeichenfolge oder eine einfache Auflistung umgewandelt? –

+0

@JamieMarshall Da es alles in ein IEnumerable von Schlüssel/Wert-Paaren steckt, sollten Sie in der Lage sein, eine foreach-Schleife zu verwenden, um durch die kombinierte Liste zu gehen. Der Schlüssel jedes Paares ist der Kopfzeilenname, und der Wert jedes Paares ist die Liste der Kopfzeilenwerte. –

+0

Es ist erwähnenswert, dass für die 'Concat' zu arbeiten, müssen Sie sicherstellen, dass Sie' using System.Linq; ' –

1

Dies funktioniert für mich:

(String[])response.Headers.GetValues("X-Error"))[0] 
+0

Ich bin neugierig auf den Grund auf die Abstimmung unten auf dieser Nisse. Ich habe es hier von einer Konsolen-App, die ich verwende, aufgenommen. – nmishr