HttpClient检索所有标头

时间:2013-05-01 15:07:22

标签: c# http http-headers windows-phone-8 dotnet-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-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);

5 个答案:

答案 0 :(得分:36)

好吧,HttpResponseMessage.Headers会返回HttpResponseHeaders引用,因此您应该可以使用GetValues()

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

答案 1 :(得分:12)

由于问题的标题是“检索所有标题”,我想添加一个答案。

HttpClient方法返回的HttpResponseMessage有两个标题属性:

  • HttpResponseMessage.HeadersHttpResponseHeaders,具有通用响应标头
  • 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);

答案 2 :(得分:8)

我试图找到一个不存在的标题时发现的问题。您应该使用TryGetValues而不是GetValues,因为在运行时,如果找不到标头,它将抛出异常。你会使用类似这样的代码:

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

答案 3 :(得分:1)

这对我有用:

import dependency from '../../src/actions';

jest.mock('../../src/actions', () => ({
    fetchDocumentsIfNeeded: jest.fn()
}));

expect(dependency.fetchDocumentsIfNeeded).toBeCalled();

答案 4 :(得分:0)

有点笨重,但易于理解。

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