【发布时间】:2019-10-17 08:05:25
【问题描述】:
This article 表示我们应该使用静态的HttpClient 来重用套接字。
但是那里的第一条评论说存在DNS更改识别问题,解决方案在另一篇文章here:
第二条建议:
var client = new HttpClient();
client.DefaultRequestHeaders.ConnectionClose = true;
哪个控制KeepAlive 标头。
但是会妨碍您利用重用套接字的好处
另一个解决方案是:
var sp = ServicePointManager.FindServicePoint(new Uri("http://foo.bar/baz/123?a=ab"));
sp.ConnectionLeaseTimeout = 60*1000; // 1 minute
但是:
他没有说我们每次要发出请求时是否应该使用new Httpclient,还是应该仍然使用静态的。
问题:
假设我想使用这个解决方案:
var sp = ServicePointManager.FindServicePoint(new Uri("http://foo.bar/baz/123?a=ab"));
sp.ConnectionLeaseTimeout = 60*1000; // 1 minute
- 我还应该使用
static HttpClient方法吗?还是每次我想打电话时都应该new HttpClient? 或者 - 我应该为每个scheme://basedns创建静态/非静态new HttpClient吗?
他展示了问题,但他的结论没有展示整个正确的最终解决方案。
请注意 - 我问的是 .net 框架。不是 .net 核心。
【问题讨论】:
-
那是一篇描述第一个问题的非常老文章。它不包含第二个问题的任何解决方案。该解决方案是使用 HttpClientFactory 代替它保留自己的 HttpClientHandlers 池并定期回收它们。
-
@PanagiotisKanavos 您在文章中哪里看到了
HttpClientFactory这个词?我还认为您在谈论.net core(我的问题不是关于core),您在其中注入类型/名称的httpclient-或IhttpClientFactory(确实使用了处理程序池)。我的问题的第二个链接也解释了第二个问题。 -
我说这是一篇非常老文章。通过引入 HttpClientFactory 在接下来的 3 年里解决了这个问题。
标签: c# .net httpclient .net-4.6.1