HttpClient извлекает все заголовки - программирование
Подтвердить что ты не робот

HttpClient извлекает все заголовки

В настоящее время я работаю над оберткой API. Если я отправил плохой Consumer Key, сервер вернет Status как 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 недоступен через код, так как это частное поле. Я получаю доступ к нему через окно Quick Watch.

Это мой фрагмент запроса:

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

Ответ 1

Ну, HttpResponseMessage.Headers возвращает ссылку HttpResponseHeaders, поэтому вы должны иметь возможность использовать GetValues()

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

Ответ 2

Поскольку заголовок вопроса - "получить все заголовки", я хотел бы добавить ответ в отношении этого.

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

Ответ 3

Просто получена, которую я обнаружил при попытке найти заголовок, которого не было. Вы должны использовать TryGetValues ​​вместо GetValues, потому что во время выполнения он генерирует исключение, если заголовок не найден. Вы бы использовали что-то вроде этого кода:

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

Ответ 4

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

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

Ответ 5

Немного громоздкий, но простой для понимания..

            System.Diagnostics.Debug.Write("----- CLIENT HEADERS -----" + Environment.NewLine);
            foreach (KeyValuePair<string, IEnumerable<string>> myHeader in myHttpClient.DefaultRequestHeaders)
            {
                System.Diagnostics.Debug.Write(myHeader.Key + Environment.NewLine);
                foreach(string myValue in myHeader.Value)
                {
                    System.Diagnostics.Debug.Write("\t" + myValue + Environment.NewLine);
                }
            }

            System.Diagnostics.Debug.Write("----- MESSAGE HEADERS -----" + Environment.NewLine);
            foreach (KeyValuePair<string, IEnumerable<string>> myHeader in myHttpRequestMessage.Headers)
            {
                System.Diagnostics.Debug.Write(myHeader.Key + Environment.NewLine);
                foreach (string myValue in myHeader.Value)
                {
                    System.Diagnostics.Debug.Write("\t" + myValue + Environment.NewLine);
                }
            }

            System.Diagnostics.Debug.Write("----- CONTENT HEADERS -----" + Environment.NewLine);
            foreach (KeyValuePair<string, IEnumerable<string>> myHeader in myHttpRequestMessage.Content.Headers)
            {
                System.Diagnostics.Debug.Write(myHeader.Key + Environment.NewLine);
                foreach (string myValue in myHeader.Value)
                {
                    System.Diagnostics.Debug.Write("\t" + myValue + Environment.NewLine);
                }
            }