Web Services 在不使用MediaTypeWithQualityHeaderValue的情况下设置接受标头

qlckcl4x  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(168)

在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是否会导致某种性能下降?

wfypjpf4

wfypjpf41#

你问题的第一部分:添加标题有什么区别吗?

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提供了很好的强类型值,并且能够添加多个接受类型。方法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应该是短期的,并且总是 Package 在using语句中。当使用同一个客户端发出多个请求时,就会发生重用。

更新

正如其他人提到的那样,Microsoft建议在应用程序的生命周期内保留一个HttpClient,以避免过多的开销。获取HttpClient的首选方法是声明一个静态的HttpClient,然后根据需要引用它。请注意,默认标头中设置的任何内容都将随每个请求发出,因此请确保不要将诸如Authorization之类的内容放在那里,除非您“确保请求的最终目的地。

相关问题