这两个电话有什么区别?我的最终目标是拥有
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
[...]
所以,除了那种奇怪的命名之外,没有什么可以在这里得到的吗?
答案 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方法添加自定义标题。