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);
Ответы
Ответ 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);
}
}