HttpClient получить все заголовки
в настоящее время я работаю над оболочкой API. Если я пошлю плохой Consumer Key
сервер будет возвращать Status
as 403 Forbidden
в заголовке. Он также передаст пользовательские заголовки. Как на самом деле получить эти пользовательские заголовки?
это ответ, полученный от сервера.
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
мне нужно забрать X-Error
и X-Error-Code
. В настоящее время я использую HttpClient
класс для обработки запроса. Если я посмотрю, как заголовки отвечают под Quick Watch в VS Studio 2012, я мог бы найти такой
((System.Net.Http.Headers.HttpHeaders)(response.Headers)).headerStore["X-Error-Code"].ParsedValue
есть ли другой способ сделать это?
изменить:
headerStore
недоступен через код, так как это частное поле. Я получаю доступ к нему только через окно быстрого наблюдения.
это мой фрагмент для запроса:
var response = await _httpClient.PostAsync("/v3/oauth/request", content);
4 ответов
Ну HttpResponseMessage.Headers
возвращает HttpResponseHeaders
ссылка, поэтому вы должны иметь возможность использовать GetValues()
string error = response.Headers.GetValues("X-Error").FirstOrDefault();
string errorCode = response.Headers.GetValues("X-Error-Code").FirstOrDefault();
поскольку заголовок вопроса "получить все заголовки", я хотел добавить ответ в отношении этого.
на HttpResponseMessage
возвращено HttpClient
методы имеют два свойства заголовка:
-
HttpResponseMessage.Headers
- этоHttpResponseHeaders
С общими заголовками ответов -
HttpResponseMessage.Content.Headers
этоHttpContentHeaders
описательные заголовки вродеContent-Type
оба объекта реализуют IEnumerable<KeyValuePair<string, IEnumerable<string>>
, так что вы можно легко объединить все заголовки с чем-то вроде этого:
var responseMessage = await httpClient.GetAsync(url);
var headers = responseMessage.Headers.Concat(responseMessage.Content.Headers);
просто gotcha, который я нашел при попытке найти заголовок, который не существовал. Вы должны использовать TryGetValues вместо GetValues, потому что во время выполнения он выдаст исключение, если заголовок не найден. Вы бы использовали что-то вроде этого кода:
IEnumerable<string> cookieHeader;
response.Headers.TryGetValues("Set-Cookie", out cookieHeader);