在不使用MediaTypeWithQualityHeaderValue的情况下设置Accept Header

时间:2015-06-04 16:31:01

标签: c# web-services asp.net-web-api asp.net-web-api2

在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

1 个答案:

答案 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语句中。当使用同一客户端发出多个请求时,就会重复使用。