2013-05-01 13 views
14

Attualmente sto lavorando su API wrapper. Se invio un numero errato, il server restituirà Status come 403 Forbidden nell'intestazione. Passerà anche intestazioni personalizzate. Come faccio a recuperare effettivamente queste intestazioni personalizzate?HttpClient recupera tutte le intestazioni

Questa è la risposta ricevuta dal server.

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 

Ho bisogno di recuperare il X-Error e X-Error-Code. Attualmente sto utilizzando la classe HttpClient per elaborare la richiesta. Se guardo le intestazioni rispondono sotto Controllo immediato in VS Studio 2012, sono riuscito a trovare in questo modo

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

C'è un altro modo per fare questo?

Modifica: headerStore non accessibile tramite codice in quanto campo privato. Ho accesso solo attraverso la finestra di Quick Watch.

Questo è il mio frammento per la richiesta:

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

risposta

28

Beh, HttpResponseMessage.Headers restituisce un riferimento HttpResponseHeaders, così si dovrebbe essere in grado di utilizzare GetValues()

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

No, non posso farlo come vorrei ricevere questo errore 'Errore 3Cannot applicare l'indicizzazione con [] per un'espressione di tipo System.Net.Http.Headers.HttpResponseHeaders''. Aggiornerò il mio codice qui sopra per chiarezza. –

+0

@ShulhiSapli: Ah - non ha notato che era 'HttpClient'. Modificherà. –

+0

Se hai bisogno di maggiori dettagli, puoi dare un'occhiata qui, https://github.com/shulhi/PocketNet/blob/dev/PocketNet/PocketNet/Authenticator/PocketOauth.cs –

8

Solo un Gotcha che ho trovato quando si cerca per trovare un'intestazione che non esisteva. È necessario utilizzare TryGetValues ​​anziché GetValues ​​perché in fase di esecuzione genererà un'eccezione se l'intestazione non viene trovata. Si potrebbe usare qualcosa di simile di questo codice:

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

Dal momento che il titolo della domanda è "recuperare tutte le intestazioni", ho voluto aggiungere una risposta per quanto riguarda questo.

I HttpResponseMessage restituiti da HttpClient metodi ha due proprietà di intestazione:

  • HttpResponseMessage.Headers è un HttpResponseHeaders con intestazioni di risposta generici
  • HttpResponseMessage.Content.Headers è un HttpContentHeaders con le intestazioni contenuti specifici come Content-Type

Entrambi gli oggetti implementano IEnumerable<KeyValuePair<string, IEnumerable<string>>, quindi è possibile combinare facilmente tutti e intestazioni con qualcosa di simile:

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

Questo crea un tipo molto complicato per la variabile delle intestazioni.Come ottenere i dati in una stringa o in una raccolta semplice? –

+0

@JamieMarshall Poiché inserisce tutto in un IEnumerable di coppie chiave/valore, è possibile utilizzare un ciclo foreach per scorrere l'elenco combinato. La chiave di ogni coppia è il nome dell'intestazione e il valore di ogni coppia è l'elenco dei valori dell'intestazione. –

+0

Vale la pena notare che per il 'Concat' funzionare è necessario assicurarsi di includere' using System.Linq; ' –

1

questo funziona per me:

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

Sono curioso di sapere il motivo del voto negativo su questo Nisse. L'ho incluso qui come da un'app console che sto usando. – nmishr

Problemi correlati