HttpClientFactory.Create 与新的 HttpClient

问题描述 投票:0回答:5

我很好奇

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。

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

使用 .NET 5,.NET Framework 和 .NET Core 之间的差异将得到调整,您应该使用

IHttpClientFactory
来代替。

更新 – 官方指导

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

.net dotnet-httpclient .net-4.6
5个回答
71
投票

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

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

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


36
投票

IHttpClientFactory
具有以下优势:

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

更多


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-class-available-in-net-core

HttpClient

的默认构造函数

存在套接字耗尽和 DNS 更改问题,这些问题已由

IHttpClientFactory

 解决。它还提供了用于增加应用程序弹性的扩展。


0
投票
让我补充@DarrelMiller 的答案:

如果扩展对您来说很重要,您应该注意 HttpClient 实例的生命周期。请参考

在WebAPI客户端中每次调用创建一个新的HttpClient的开销是多少?


0
投票
HTTPClientFactory 管理 HttpClient 实例的生命周期 HTTPClientFactory 将重用当前实例,而不是为每个请求创建 HTTPClient,从而减少创建和处置 HttpClient 实例的开销并提高性能

© www.soinside.com 2019 - 2024. All rights reserved.