36

这两个调用有什么区别?我的最终目标是通过网络 Accept: application/json发送,而不是附加到一些默认的其他 MIME 类型集。

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

对比

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
[...]

所以,除了那种奇怪的命名之外,这里没有别的东西可以得到吗?

4

3 回答 3

27

没有区别。

DefaultRequestHeaders.Accept是字符串类型的集合,您可以在其中添加标头以使用MediaTypeWithQualityHeaderValue.

client.DefaultRequestHeaders是一个字典,它接受请求标头的键和值,并根据它们匹配结果。

DefaultRequestHeaders

有过载。

它们之间唯一不同的是,DefaultRequestHeaders.Accept需要您初始化一个新的MediaTypeWithQualityHeaderValue类实例,从而在堆中产生另一个引用类型,同时client.DefaultRequestHeaders将数据添加到字典中,从而消除资源成本和需要初始化一个新实例。

至于如何使用以及使用什么,这完全取决于用户。

于 2017-11-08T10:04:19.260 回答
13

只要名称和值正确,最终结果就没有区别。

HTTP 标准指定某些标头具有质量因子,因此名称为MediaTypeWithQualityHeaderValue。这是一个可以具有质量因子的 MediaType 标头值。如果使用MediaTypeWithQualityHeaderValue Constructor (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");
于 2017-11-08T10:15:57.753 回答
0

我认为没有区别,它只是通过 Accept 等属性添加标准标头的一种更简单的方法,通过 Add 方法添加自定义标头也很方便。

于 2017-11-08T10:08:09.010 回答