创建与新的 HttpClient

我很好奇 HttpClientFactory的目的是什么。没有描述为什么它存在于 MSDN 上(见链接)。

有一些带有更多专门化参数的 Create方法,但我最想知道的是,没有参数的调用和普通构造函数之间有什么区别。


var httpClient = HttpClientFactory.Create();

VS

var httpClient = new HttpClient();

在大多数例子中,我看到了 new HttpClient()的使用,没有任何 using语句,即使 HttpClient是从 IDisposable派生出来的。

因为 HttpClient类是从 IDisposable派生出来的,所以工厂是否执行了一些池或缓存操作?是否有绩效福利,还是无关紧要?

更新-.NET Core 2.1中的 IHttpClientFactory

请注意,由于问了这个问题,新版本的。NET 已经发布,并且。NET Core 2.1为获得 HTTP 客户端引入了一种全新的、经过大量改进的方法。

参考下面 Ali Bayat 的回答,使用 IHttpClientFactory代替.NET Core。

然而,我保留达雷尔米勒的答案作为接受的答案,因为这是正确的答案用于。NET Framework 最高版本为 v4.8,为此提出了这个问题。

对于.NET5,.NETFramework 和.NETCore 之间的差异将被对齐,您应该改用 IHttpClientFactory

最新情况-官方指引

Microsoft 添加了有关处置行为和推荐使用的文档: Https://learn.microsoft.com/en-us/dotnet/fundamentals/networking/httpclient-guidelines

68848 次浏览

工厂是帮助器方法,用于在管道中有多个 GeneratingHandler 时帮助创建客户端。委托处理程序需要连接在一起才能形成管道。这个工厂允许您将处理程序作为数组传递进来,工厂将负责将它们连接在一起。

我相信,而且不相信我的话,CreatePilemethod 可以在服务器端用于为 Web API HttpServer 构建消息处理管道。

我很高兴您没有看到很多在 HTTPClient 周围使用块的例子,因为我已经反对这种做法好几年了。尽管 HttpClient 确实实现了一次性支持,但它只是为了处理异常情况,即当请求正在进行时,它被销毁。HttpClient 实例应该是长寿命的。处理它们会强制关闭应该被池化的底层 TCP 连接。HttpClient 是线程安全的,可以由不同的线程安全地使用多次。这就是它打算如何使用,而不是单一使用,使用块模式,我经常看到。

让我补充一下@DarrelMiller 的回答:

如果可伸缩性对您来说很重要,那么您应该注意 HttpClient 实例的生存期。请参阅 在 WebAPI 客户机中每次调用创建一个新的 HttpClient 的开销是多少?

IHttpClientFactory提供以下好处:

  1. 命名和配置逻辑 HttpClient实例。
  2. 建立一个 发出请求中间件来管理 关于 HTTP 请求的横切关注点。
  3. 波莉集成用于瞬态故障处理。
  4. 通过管理 HttpClient生命周期来避免常见的 域名解析系统问题。
  5. 对象创建的客户端发送的所有请求添加 伐木 工厂。

更多

正如

Https://learn.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

那个

缺省构造函数

有套接字枯竭和 DNS 改变的问题,这是由 IHttpClientFactory解决。它还提供了向应用程序添加弹性的扩展。