【发布时间】:2019-08-08 21:31:35
【问题描述】:
我们如何重用 HttpClient 的静态实例?
我有一个静态的HttpClient,我想同时重用它:
private static HttpClient client = new HttpClient();
我正在这样创建我的请求:
var attachTopic = GetEnvironmentVariable("Attach:EventTopicUri");
var attachTopicKey = GetEnvironmentVariable("Attach:EventTopicKey");
client.BaseAddress = new Uri(attachTopic);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("aeg-sas-key", attachTopicKey);
然后发布请求:
await client.PostAsJsonAsync("", new[] { /*some awesome object*/ });
但是,我遇到了以下问题:
我们如何在静态 HttpClient 上发出具有相同标头信息的并发请求?
【问题讨论】:
-
你不能像
BaseAddress或client.DefaultRequestHeaders.Accept.Clear();这样跨多个并发请求设置属性。我建议设置一次DefaultRequestHeaders(在启动时),而不是设置BaseAddress。或者,在由string键入的字典中具有单独的HttpClient对象。然后将多个共享客户端放在那里,每个客户端都有不同的BaseAddress。 -
如果您使用 .NET Core,HttpClientFactory 将为每个
BaseAddress返回静态 HttpClients,并在 DNS 解析发生变化时更新连接。 -
在@mjwills 评论的基础上,您的
BaseAddress也应该是您发送请求的域,它不应该在请求之间更改,您在GetAsync中使用的请求URL 将更改为那就是您从域中请求的路径/资源。如果域不同,那么它们就是不同的HttpClient实例,每个域都可以重复使用,正如 Dour High Arch 指出的那样。
标签: c# .net httpclient azure-functions