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);

это работает для меня:

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