在Asp.Net Web Api 2中,使用以下传统方法设置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在以下帖子What is the overhead of creating a new HttpClient per call in a WebAPI client?中的回答,似乎首选方法是使用DefaultRequestHeaders
属性,因为它包含用于多个调用的属性。这是否意味着如果我使用简单字典设置默认标头我的HttpClient client
效率不会高于使用DefaultRequestHeaders
的字典?另外我真的不明白DefaultRequestHeaders
里面的值会如何重用?假设我使用HttpClient client
创建了20 HttpClientFactory.Create
,并在其中的每一个中设置了DefaultRequestHeaders
属性[我真的需要这样做,因为DefaultRequestHeaders是要重用的吗?!]。这种重用的位置在哪里,并且每当我创建DefaultRequestHeaders
某个性能影响时都会设置HttpClient client
?
答案 0 :(得分:-1)
你的问题的第一部分:添加标题有什么不同吗?
HttpClient client = HttpClientFactory.Create(handler);
方法1:
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
方法2:
var headers = new Dictionary<string, string>{{"Accept", "application/json"}};
headers.ForEach(h => client.DefaultRequestHeaders.Add(h.Key, h.Value));
方法1为您提供了很好的强类型值,可以添加多个接受类型。方法2还有一个&#34;魔术字符串&#34;这可能是拼写错误的地方,也无法添加多种接受类型。
问题的第2部分:性能和重用价值在哪里?
对每个请求使用新的HttpClient的性能取决于您的用例。获得一个基准标记并测量是否重要。开发人员的表现最有可能获得收益。请考虑您使用的每个HttpClient都必须记住要添加的一堆标头。如果您忘记添加正确的标头,则会发生错误。因此,您可以使用DefaultRequestHeaders在工厂中设置它们。
public class ApiService
{
public static HttpClient GetClient()
{
var client = new HttpClient(new Uri("https://someservice/"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//add any other setup items here.
return client;
}
}
现在使用它:
public async Task DoStuff()
{
using(var client = ApiService.GetClient())
{
//client will have the proper base uri and all the headers set.
var data = await client.GetAsync<dynamic>("Sales");
//client will still have the proper base uri and all the headers set.
var data2 = await client.GetAsync<dynamic>("Products");
}
}
HttpClients应该是短暂的并且始终包含在using语句中。当使用同一客户端发出多个请求时,就会重复使用。