HttpClientFactory.Create与新的HttpClient

Bar*_*jen 27 .net dotnet-httpclient

我很好奇这HttpClientFactory堂课的目的是什么.没有描述MSDN上存在的原因(参见链接).

有些Create方法有更专业的参数,但大多数我不知道没有参数的调用和普通的构造函数之间有什么区别.


var httpClient = HttpClientFactory.Create();
Run Code Online (Sandbox Code Playgroud)

VS

var httpClient = new HttpClient();
Run Code Online (Sandbox Code Playgroud)

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

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

Dar*_*ler 40

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

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

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

  • @Darrel,请注意,虽然大多数方法都是线程安全的,但实例成员不是(大多数.NET Framework中的情况) - 请参阅http://msdn.microsoft.com/en-us/library /system.net.http.httpclient(v=vs.110).aspx (3认同)

Ali*_*yat 21

IHttpClientFactory 提供以下好处:

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

更多的

  • @bytedev 截至今天,似乎仍然没有一种方法可以在不依赖 Microsoft 自己的 DI 容器的情况下使用具体实现。关于此问题的讨论正在进行中:https://github.com/dotnet/aspnetcore/issues/28385 (3认同)
  • 感谢您添加此指导,因为随着 .NET Core 中引入“IHttpClientFactory”,它是提出此问题时可用选项的更好替代方案。 (2认同)
  • 我很好奇.NET Core 中是否有一个实际的类实现了 IHttpClientFactory,具体的?使用它的唯一方法似乎是使用 IoC 容器并调用 services.AddHttpClient() (2认同)

Dee*_*hra 7

正如中提到的

https://learn.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. 它还提供了用于增加应用程序弹性的扩展。