C#将Accept标头添加到HttpClient

时间:2017-11-08 09:34:48

标签: c# httpclient dotnet-httpclient .net-core-2.0 http-accept-header

这两个电话有什么区别?我的最终目标是拥有 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
[...]

所以,除了那种奇怪的命名之外,没有什么可以在这里得到的吗?

3 个答案:

答案 0 :(得分:9)

没有区别。

DefaultRequestHeaders.Accept 是字符串类型的集合,您可以使用新MediaTypeWithQualityHeaderValue实例添加标题以接受。

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

DefaultRequestHeaders

有重载。

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

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

答案 1 :(得分:3)

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

HTTP标准指定certain headers have a quality factor,因此名称为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");

答案 2 :(得分:0)

我认为不一样,它只是通过Accept等属性添加标准标题的更简单方法,也方便通过Add方法添加自定义标题。