2013-05-01 34 views
14

Hiện tại, tôi đang làm việc trên trình bao bọc API. Nếu tôi gửi số điện thoại xấu Consumer Key, máy chủ sẽ trả lại Status làm 403 Forbidden trong tiêu đề. Nó cũng sẽ chuyển các tiêu đề tùy chỉnh. Làm cách nào để tôi thực sự truy lục các tiêu đề tùy chỉnh này?HttpClient truy xuất tất cả các tiêu đề

Đây là phản hồi nhận được từ máy chủ.

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 

Tôi cần truy xuất X-ErrorX-Error-Code. Hiện tại, tôi đang sử dụng lớp học HttpClient để xử lý yêu cầu. Nếu tôi xem các tiêu đề phản ứng dưới Nhanh Xem trong VS Studio 2012, tôi có thể thấy nó như thế này

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

Có cách nào khác để làm điều này?

Chỉnh sửa: headerStore không thể truy cập qua mã thông qua vì đây là trường riêng tư. Tôi chỉ có quyền truy cập vào nó thông qua cửa sổ Xem nhanh.

Đây là đoạn mã của tôi cho các yêu cầu:

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

Trả lời

28

Vâng, HttpResponseMessage.Headers trả về một tham chiếu HttpResponseHeaders, vì vậy bạn sẽ có thể sử dụng GetValues()

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

Không, tôi không thể làm điều đó như tôi sẽ nhận được lỗi này 'Lỗi 3Cannot áp dụng lập chỉ mục với [] để một biểu thức loại System.Net.Http.Headers.HttpResponseHeaders''. Tôi sẽ cập nhật mã của tôi ở trên để rõ ràng. –

+0

@ShulhiSapli: Ah - đã không phát hiện ra rằng đó là 'HttpClient'. Sẽ chỉnh sửa. –

+0

Nếu bạn cần thêm chi tiết, bạn có thể xem tại đây, https://github.com/shulhi/PocketNet/blob/dev/PocketNet/PocketNet/Authenticator/PocketOauth.cs –

8

Chỉ cần một Gotcha mà tôi thấy khi cố để tìm tiêu đề không tồn tại. Bạn nên sử dụng TryGetValues ​​thay vì GetValues ​​vì ​​lúc chạy nó sẽ ném một ngoại lệ nếu không tìm thấy tiêu đề. Bạn sẽ sử dụng một cái gì đó như mã này:

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

Vì tiêu đề của câu hỏi là "truy xuất tất cả tiêu đề", tôi muốn thêm câu trả lời liên quan đến điều đó.

Các HttpResponseMessage trả về bởi HttpClient phương pháp có hai thuộc tính tiêu đề:

  • HttpResponseMessage.Headers là một HttpResponseHeaders với tiêu đề phản ứng chung
  • HttpResponseMessage.Content.Headers là một HttpContentHeaders với tiêu đề nội dung cụ thể như Content-Type

Cả đối tượng thực hiện IEnumerable<KeyValuePair<string, IEnumerable<string>>, vì vậy bạn có thể dễ dàng kết hợp tất cả các thứ tiêu đề e với một cái gì đó như thế này:

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

Điều này tạo ra một loại rất phức tạp cho biến tiêu đề.Làm thế nào để có được dữ liệu ra một chuỗi hoặc một bộ sưu tập đơn giản? –

+0

@JamieMarshall Vì nó đặt tất cả mọi thứ vào một IEnumerable của cặp khóa/giá trị, bạn sẽ có thể sử dụng một vòng lặp foreach để đi qua danh sách kết hợp. Khóa của mỗi cặp là tên tiêu đề và giá trị của mỗi cặp là danh sách các giá trị tiêu đề. –

+0

Cần lưu ý rằng để 'Concat' hoạt động, bạn cần đảm bảo rằng bạn bao gồm' using System.Linq; ' –

1

này làm việc cho tôi:

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

Tôi tò mò vì lý do bỏ phiếu xuống trên Nisse này. Tôi đã bao gồm nó ở đây như là từ một ứng dụng giao diện điều khiển tôi đang sử dụng. – nmishr

Các vấn đề liên quan