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
类来处理请求。 如果我在VS Studio 2012的Quick Watch下看到标题响应,我可以像这样找到它
((System.Net.Http.Headers.HttpHeaders)(response.Headers)).headerStore["X-Error-Code"].ParsedValue
有没有其他方法可以做到这一点?
编辑: headerStore
无法通过代码访问,因为这是私有字段。 我只能通过Quick Watch窗口访问它。
这是我的请求片段:
var response = await _httpClient.PostAsync("/v3/oauth/request", content);
好吧, HttpResponseMessage.Headers
返回一个HttpResponseHeaders
引用,所以你应该可以使用GetValues()
string error = response.Headers.GetValues("X-Error").FirstOrDefault(); string errorCode = response.Headers.GetValues("X-Error-Code").FirstOrDefault();
由于问题的标题是“检索所有标题”,我想添加一个答案。
HttpClient
方法返回的HttpResponseMessage
有两个头属性:
-
HttpResponseMessage.Headers
是一个带有通用响应头的HttpResponseHeaders
-
HttpResponseMessage.Content.Headers
是一个HttpContentHeaders
,包含Content-Type
等特定于内容的标题
这两个对象都实现了IEnumerable
,因此您可以轻松地将所有标头组合成以下内容:
var responseMessage = await httpClient.GetAsync(url); var headers = responseMessage.Headers.Concat(responseMessage.Content.Headers);
只是在尝试找到不存在的标题时发现的问题。 您应该使用TryGetValues而不是GetValues,因为在运行时,如果找不到标头,它将抛出exception。 你会使用类似这样的代码:
IEnumerable cookieHeader; response.Headers.TryGetValues("Set-Cookie", out cookieHeader);
这对我有用:
(String[])response.Headers.GetValues("X-Error"))[0]