我很好奇HttpClientFactory
class的目的是什么。 MSDN上没有说明它存在的原因(见链接)。
有Create
methods有更多专门的参数,但大多数我不知道没有参数的调用和普通的构造函数之间有什么区别。
var httpClient = HttpClientFactory.Create();
VS
var httpClient = new HttpClient();
在大多数示例中,我看到new HttpClient()
的使用,没有任何using
语句,即使HttpClient
class来自IDisposable
。
由于HttpClient
类派生自IDisposable
,工厂是否有一些池化或缓存?是否有性能优势,或者无关紧要?
答案 0 :(得分:35)
当你在管道中有多个DelegatingHandler时,工厂是帮助创建客户端的辅助方法。委托处理程序需要连接在一起以形成管道。这个工厂允许你将处理程序作为一个数组传递,工厂将把它们连接在一起。
我相信,并且不要相信我的话,可以在服务器端使用CreatePipeline方法来构建Web API HttpServer的消息处理管道。
我很高兴你没有看到很多关于在HTTPClient周围使用块的例子,因为我一直在与这种做法作斗争,感觉就像多年。尽管HttpClient确实实现了一次性,但它只能处理在请求正在进行时被破坏的异常情况。 HttpClient实例应该是长寿的。处置它们强制关闭应该被池化的底层TCP连接。 HttpClient是线程安全的,可以通过不同的线程安全地使用多次。这就是如何使用,而不是单独使用,使用我经常看到的块模式。
答案 1 :(得分:9)
IHttpClientFactory
具有以下优点:
HttpClient
实例。HttpClient
的生存期来避免常见的 DNS 问题。答案 2 :(得分:0)
让我加入@ DarrelMiller的回答:
如果缩放对您来说很重要,您应该注意HttpClient实例的生命周期。请参阅What is the overhead of creating a new HttpClient per call in a WebAPI client?
答案 3 :(得分:0)
如
中所述
HttpClient
的默认构造函数
具有套接字耗尽和DNS更改问题,IHttpClientFactory
已解决。它还提供了扩展功能,可以为应用程序增加弹性。