web-dev-qa-db-ja.com

C#AcceptヘッダーをHttpClientに追加する

これら2つの呼び出しの違いは何ですか?私の最終目標はAccept: application/jsonネットワーク経由で送信され、他のMIMEタイプのデフォルトセットに追加されません。

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/json");

vs.

client.DefaultRequestHeaders
  .Accept
  .Add(new MediaTypeWithQualityHeaderValue("application/json"));

私のCLRは.NET Core 2.0です。

ワイヤーをスニッフィングしても違いはわかりません。

# just .Add("Accept"...
~ % nc -l 8000
GET / HTTP/1.1
Connection: Keep-Alive
Accept: application/json
[...]

# with MediaTypeWithQualityHeaderValue
~ % nc -l 8000
GET / HTTP/1.1
Connection: Keep-Alive
Accept: application/json
[...]

それで、そのタイプの奇妙なネーミング以外に、ここで他に何も得ることはありませんか?

19
evilSnobu

違いはありません。

DefaultRequestHeaders.Acceptは文字列タイプのコレクションであり、MediaTypeWithQualityHeaderValueの新しいインスタンスを使用して受け入れるヘッダーを追加できます。

client.DefaultRequestHeadersは、リクエストヘッダーのキーと値を受け入れ、それらに従って結果を照合するディクショナリです。

DefaultRequestHeaders

オーバーロードがあります。

それらの間で異なる唯一のことは、DefaultRequestHeaders.Acceptは、MediaTypeWithQualityHeaderValueクラスの新しいインスタンスを初期化する必要があるため、ヒープ内に別の参照型が生成されますが、client.DefaultRequestHeadersは、データをディクショナリに追加し、リソースのコストと新しいインスタンスを初期化する必要を取り除きます。

使用方法と使用方法は、ユーザー次第です。

14
Barr J

名前と値が正しい限り、最終結果に違いはありません。

HTTP標準では 特定のヘッダーには品質係数があります 、つまり MediaTypeWithQualityHeaderValue という名前が指定されています。これは、品質係数を持つことができるMediaTypeヘッダー値です。 MediaTypeWithQualityHeaderValueコンストラクター(String、Double) コンストラクターを使用する場合、品質係数を渡すことができます

標準のAcceptヘッダーセクションは、品質係数を使用するいくつかの例を示しています。例えば、

   Accept: audio/*; q=0.2, audio/basic

「私はオーディオ/ベーシックを好むが、80%の品質低下で最高の品質が得られれば、どんなオーディオタイプでも送ってください」と解釈すべきです。

あなたはそれを書くことができます

var requestAccepts=client.DefaultRequestHeaders.Accept;
requestAccepts.Add(new MediaTypeWithQualityHeaderValue("audio/*",0.2));
requestAccepts.Add(new MediaTypeWithQualityHeaderValue("audio/basic"));

または、次のコマンドで生のヘッダー値を入力できます。

client.DefaultRequestHeaders.Add("Accept", "audio/*; q=0.2, audio/basic");
4

Acceptのようなプロパティを介して標準ヘッダーを追加するより簡単な方法であり、Addメソッドを介してカスタムヘッダーを追加するのも便利であるという違いはないと思います。

0
AJ -