HttpClient检索所有标头

目前,我正在研究API包装器。 如果我发送一个错误的Consumer Key ,服务器将在标题中返回Status403 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-ErrorX-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]