2013-05-01 3 views
14

現在、私はAPIラッパーを開発中です。 Consumer Keyを送信すると、サーバーはStatus403 Forbiddenとしてヘッダーに返します。カスタムヘッダも渡します。これらのカスタムヘッダーを実際に取得するにはどうすればよいですか?HttpClientがすべてのヘッダーを取得します

これはサーバーからの応答です。

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年にはクイック・ウォッチの下に応え、私はこの

((System.Net.Http.Headers.HttpHeaders)(response.Headers)).headerStore["X-Error-Code"].ParsedValue

ようにそれを見つけることができる、これを行うための他の方法はありますか?

編集: headerStoreはプライベートフィールドであるため、コードでアクセスできません。クイックウォッチウィンドウからしかアクセスできません。

これは、要求のための私の抜粋です:

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

答えて

28

まあ、HttpResponseHeaders参照を返しますので、あなたがしようとしたときに私が見つけただけ落とし穴GetValues()

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

いや、私はこのエラーを受け取ることになるとして、 'エラーが[]の式にしてインデックスを適用3CannotことはできませんタイプSystem.Net.Http.Headers.HttpResponseHeaders''の。わかりやすくするために上記のコードを更新します。 –

+0

@ ShulhiSapli:Ah-それが「HttpClient」であることに気付かなかった。編集します。 –

+0

詳細が必要な場合は、こちらをご覧くださいhttps://github.com/shulhi/PocketNet/blob/dev/PocketNet/PocketNet/Authenticator/PocketOauth.cs –

8

を使用することができるはずです​​存在しなかったヘッダーを検索します。実行時にヘッダーが見つからない場合は例外がスローされるため、GetValuesの代わりにTryGetValuesを使用する必要があります。このコードのようなものを使用します:

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

質問のタイトルは「すべてのヘッダーを取得」ですので、その回答を追加したいと思います。

HttpClientメソッドによって返さHttpResponseMessageは、2つのヘッダ特性を有する:

  • HttpResponseMessage.Headersは、一般的なレスポンスヘッダを持つHttpResponseHeaders
  • HttpResponseMessage.Content.HeadersContent-Type

両方のようなコンテンツ固有のヘッダを持つHttpContentHeadersでありますオブジェクトはIEnumerable<KeyValuePair<string, IEnumerable<string>>を実装しているので、簡単にすべてのthこれは、私の作品

var responseMessage = await httpClient.GetAsync(url); 
var headers = responseMessage.Headers.Concat(responseMessage.Content.Headers); 
+0

これは、headers変数に非常に複雑な型を作成します。文字列や単純なコレクションにデータを取り込むにはどうしたらいいですか? –

+0

@ JamieMarshall IEnumerableのキー/値ペアにすべてを格納するので、foreachループを使用して結合リストを処理できるはずです。各ペアのキーはヘッダー名であり、各ペアの値はヘッダー値のリストです。 –

+0

'Concat'を動作させるには、' using System.Linq;を使用することを確認する必要があることに注意する価値があります。 –

1

:このような何かを持つ電子ヘッダを

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

私はこのNisseの投票で理由が不思議です。私はそれを私が使用しているコンソールアプリからのものとしてここに含めました。 – nmishr

関連する問題