HttpClientFactory.Create与新的HttpClient

时间:2013-09-24 08:01:23

标签: .net dotnet-httpclient

我很好奇HttpClientFactory class的目的是什么。 MSDN上没有说明它存在的原因(见链接)。

Create methods有更多专门的参数,但大多数我不知道没有参数的调用和普通的构造函数之间有什么区别。


var httpClient = HttpClientFactory.Create();

VS

var httpClient = new HttpClient();

在大多数示例中,我看到new HttpClient()的使用,没有任何using语句,即使HttpClient class来自IDisposable

由于HttpClient类派生自IDisposable,工厂是否有一些池化或缓存?是否有性能优势,或者无关紧要?

4 个答案:

答案 0 :(得分:35)

当你在管道中有多个DelegatingHandler时,工厂是帮助创建客户端的辅助方法。委托处理程序需要连接在一起以形成管道。这个工厂允许你将处理程序作为一个数组传递,工厂将把它们连接在一起。

我相信,并且不要相信我的话,可以在服务器端使用CreatePipeline方法来构建Web API HttpServer的消息处理管道。

我很高兴你没有看到很多关于在HTTPClient周围使用块的例子,因为我一直在与这种做法作斗争,感觉就像多年。尽管HttpClient确实实现了一次性,但它只能处理在请求正在进行时被破坏的异常情况。 HttpClient实例应该是长寿的。处置它们强制关闭应该被池化的底层TCP连接。 HttpClient是线程安全的,可以通过不同的线程安全地使用多次。这就是如何使用,而不是单独使用,使用我经常看到的块模式。

答案 1 :(得分:9)

IHttpClientFactory具有以下优点:

  1. 命名和配置逻辑HttpClient实例。
  2. 构建外发请求中间件进行管理 关于HTTP请求的跨领域问题
  3. Polly 集成以进行瞬时故障处理。
  4. 通过管理HttpClient的生存期来避免常见的 DNS 问题。
  5. 为通过由Google创建的客户端发送的所有请求添加日志记录 工厂。

more

答案 2 :(得分:0)

让我加入@ DarrelMiller的回答:

如果缩放对您来说很重要,您应该注意HttpClient实例的生命周期。请参阅What is the overhead of creating a new HttpClient per call in a WebAPI client?

答案 3 :(得分:0)

中所述

https://docs.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests#issues-with-the-original-httpclient-class-available-in-net-core

HttpClient的默认构造函数

具有套接字耗尽和DNS更改问题,IHttpClientFactory已解决。它还提供了扩展功能,可以为应用程序增加弹性。