65

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

有些Create方法具有更专业的参数,但我主要想知道不带参数的调用和普通构造函数之间有什么区别。


var httpClient = HttpClientFactory.Create();

VS

var httpClient = new HttpClient();

在大多数示例中,我看到使用new HttpClient(), 没有任何using语句,即使HttpClient该类派生自IDisposable.

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

更新 - .NET Core 2.1 中的 <code>IHttpClientFactory

请注意,自从提出这个问题以来,已经发布了较新版本的 .NET,并且 .NET Core 2.1 引入了一种新的且经过大幅改进的方法来获取 HTTP 客户端。

请参阅下面 Ali Bayat 的回答,以便IHttpClientFactory与 .NET Core 一起使用。

但是,我将 Darrel Miller 的答案保留为已接受的答案,因为这是在 .NET Framework v4.8 之前使用的正确答案,为此提出了这个问题。

在 .NET 5 中,.NET Framework 和 .NET Core 之间的差异将得到调整,您应该IHttpClientFactory改用它。

4

4 回答 4

65

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

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

我很高兴你没有看到很多在 HTTPClient 周围使用块的例子,因为我多年来一直在反对这种做法。尽管 HttpClient 确实实现了一次性,但它仅用于处理在请求进行时它被销毁的异常情况。HttpClient 实例应该是长期存在的。处理它们会强制关闭应该被池化的底层 TCP 连接。HttpClient 是线程安全的,可以被不同的线程安全地多次使用。这就是我经常看到的使用块模式的方式,而不是一次性使用。

于 2013-09-25T11:30:33.960 回答
28

IHttpClientFactory提供以下好处:

  1. 命名和配置逻辑HttpClient实例。
  2. 构建一个传出请求中间件来管理 围绕 HTTP 请求的横切关注点。
  3. 与Polly集成以进行瞬态故障处理。
  4. 通过管理生命周期来避免常见的DNS问题。HttpClient
  5. 为通过工厂创建的客户端发送的所有请求添加日志记录。

更多的

于 2020-02-27T07:40:06.543 回答
3

如中所述

https://docs.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests#issues-with-the-original-httpclient-网络核心中可用的类

默认构造函数HttpClient

有套接字耗尽和 DNS 更改问题,由IHttpClientFactory. 它还提供扩展以增加应用程序的弹性。

于 2020-04-20T14:40:05.687 回答
0

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

如果缩放对您很重要,您应该注意 HttpClient 实例的生命周期。请参阅在 WebAPI 客户端中每次调用创建一个新的 HttpClient 的开销是多少?

于 2017-07-06T20:30:39.810 回答