2013-05-01 20 views
14

Şu anda API sarıcı üzerinde çalışıyorum. Consumer Key hatalı gönderirseniz, sunucu Status başlığına 403 Forbidden olarak dönecektir. Ayrıca özel başlıklar da geçecek. Bu özel başlıkları nasıl edinebilirim?HttpClient tüm üstbilgileri al

Bu, sunucudan yanıt alıyor.

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 

Ben X-Error ve X-Error-Code almak gerekir. Şu anda, isteği işlemek için HttpClient sınıfını kullanıyorum. Ben başlıkları VS Studio 2012 Hızlı İzle altında cevap izlersen, bunu yapmak için başka bir yolu var mı bu

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

gibi bulabilirler?

Düzenleme: headerStore Bu özel alan erişilebilir değildir. Sadece Quick Watch penceresinden erişebiliyorum. Eğer çalışırken buldum GetValues()

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

cevap

28

Eh, HttpResponseMessage.Headers bir HttpResponseHeaders başvuru verir:

Bu istek için benim snippet'idir olmayan bir başlık bulmak için. GetValues ​​yerine TryGetValues ​​kullanmalısınız çünkü çalışma zamanında, başlık bulunamazsa bir istisna atar. Bu kodu gibi bir şey kullanırsınız:

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

Hayır, ben yapamam ben bu hatayı alacağı olarak 'Hata bir ifadeye [] ile indeksleme uygulamak 3Cannot o System.Net.Http.Headers.HttpResponseHeaders 'yazın. Açıklık için yukarıdaki kodumu güncelleyeceğim. –

+0

@ShulhiSapli: Ah - "HttpClient" olduğunu fark etmemişti. Düzenleyecek –

+0

Daha fazla ayrıntıya ihtiyacınız varsa, buraya bir göz atabilirsiniz, https://github.com/shulhi/PocketNet/blob/dev/PocketNet/PocketNet/Authenticator/PocketOauth.cs –

8

Sadece bir gotcha kullanmak gerekir, böylece

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

soru başlığı yana "Tüm başlıkları almak" olduğunu, bunu açısından bir cevap eklemek istedim.

HttpResponseMessageHttpClient yöntemlerle sahip dönen iki başlık özellikleri:

  • HttpResponseMessage.Headers genel yanıt başlıkları
  • HttpResponseMessage.Content.Headers bir HttpResponseHeaders olan Content-Type

Hem gibi içerik özgü başlıkları içeren bir HttpContentHeaders olan Nesneleri uygulamak IEnumerable<KeyValuePair<string, IEnumerable<string>>, böylece tüm th kolayca birleştirebilirsiniz Böyle bir şey e başlıkları:

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

Bu, üstbilgi değişkeni için çok karmaşık bir tür oluşturur.Verileri bir dizeye veya basit bir koleksiyona nasıl dağıtabilirsiniz? –

+0

@JamieMarshall Her şeyi bir anahtar/değer çiftleri IENumerable içine koyar yana, birleştirilmiş listeyi geçmek için bir foreach döngü kullanabilmeniz gerekir. Her bir çiftin anahtarı, başlık adıdır ve her bir çiftin değeri, başlık değerlerinin listesidir. –

+0

“Concat” ın çalışması için, System.Linq kullanarak –

1

Bu benim için çalışıyor:

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

'u dahil ettiğinizden emin olmanız gerektiğini unutmayın. Bu Nisse'deki oylamada nedenini merak ediyorum. Ben onu kullanıyorum bir konsol uygulaması olarak buraya ekledim. – nmishr