gpt4 book ai didi

c# - 在不使用 MediaTypeWithQualityHeaderValue 的情况下设置接受 header

转载 作者:太空狗 更新时间:2023-10-29 23:44:51 29 4
gpt4 key购买 nike

在 Asp.Net Web Api 2 中,使用以下传统方法设置 HttpClient 接受 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 属性,因为它包含用于多次调用的属性。这是否意味着如果我使用简单字典设置默认 header ,我的 HttpClient 客户端 将不会像使用 DefaultRequestHeaders 的那样高效?另外我真的无法理解 DefaultRequestHeaders 中的值将如何被重用?假设我使用 HttpClientFactory.Create 创建了 20 个 HttpClient 客户端,并在其中的每个客户端中设置了 DefaultRequestHeaders 属性 [Do I really need to do它是因为 DefaultRequestHeaders 是为了被重用?!]。每次我创建 HttpClient 客户端 时,这种重用在哪里启动并设置 DefaultRequestHeaders 会导致某种性能下降?

最佳答案

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

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 多了一个“魔术字符串”,可能会出现拼写错误,并且无法添加多个接受类型。

问题的第 2 部分:性能和重用值(value)在哪里?

对每个请求使用新的 HttpClient 的性能影响取决于您的用例。获得一个基准并进行测量,看看它是否重要。开发人员的表现最有可能是 yield 所在。考虑到您使用的每个 HttpClient 都必须记住要添加的一堆 header 。如果您忘记添加正确的 header ,则会发生错误。因此,您可以使用 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 语句中。当使用同一个客户端发出多个请求时,就会发生重用。

更新:

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

关于c# - 在不使用 MediaTypeWithQualityHeaderValue 的情况下设置接受 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30649347/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com