在Asp.NetWebApi2中,使用以下传统方法设置HttpClient Accept Header与使用以下传统方法设置HttpClient Accept Header有什么区别:
HttpClient client = HttpClientFactory.Create(handler);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
和以下方法:
var headers = new Dictionary<string, string>
{
{"Accept", "application/json"}};
headers.ForEach(h => client.DefaultRequestHeaders.Add(h.Key, h.Value));
更新1:
根据@DarrenMiller在以下帖子中的回答:在WebAPI客户端中每次调用创建一个新HttpClient的开销是多少?似乎首选方法是使用DefaultRequestHeaders
属性,因为它包含用于多个调用的属性。这是否意味着,如果我使用简单的字典设置默认头,我的HttpClient client
将不如使用DefaultRequestHeaders
的效率高?此外,我真的不明白DefaultRequestHeaders
中的值将如何被重用?假设我使用HttpClientFactory.Create
创建了20个HttpClient client
,并在其中的每一个中设置了DefaultRequestHeaders
属性[我真的需要这样做吗,因为DefaultRequestHeaders是要重用的?!]。这种重用在哪里开始-每次创建HttpClient client
时设置DefaultRequestHeaders
是否会导致某种性能下降?
1条答案
按热度按时间wfypjpf41#
你问题的第一部分:添加标题有什么区别吗?
方法一:
方法二:
方法1提供了很好的强类型值,并且能够添加多个接受类型。方法2多了一个“魔术字符串”,这可能是一个打字错误的地方,并且没有办法添加多个接受类型。
您问题的第二部分:性能和重用价值在哪里?
为每个请求使用新的HttpClient对性能的影响取决于您的用例。获取基准并测量它是否重要。开发人员的性能最有可能是收益的地方。考虑到您使用的每个HttpClient都必须记住要添加的一堆头。如果您忘记添加正确的头,错误就会发生。因此,您可以使用DefaultRequestHeaders在工厂中设置它们。
现在使用它:
HttpClients应该是短期的,并且总是 Package 在using语句中。当使用同一个客户端发出多个请求时,就会发生重用。
更新:
正如其他人提到的那样,Microsoft建议在应用程序的生命周期内保留一个HttpClient,以避免过多的开销。获取HttpClient的首选方法是声明一个静态的HttpClient,然后根据需要引用它。请注意,默认标头中设置的任何内容都将随每个请求发出,因此请确保不要将诸如Authorization之类的内容放在那里,除非您“确保请求的最终目的地。