HttpClientFactory
课程的目的是什么。 MSDN 上没有说明它为何存在(请参阅链接)。
Create
方法带有更专门的参数,但我主要想知道无参数调用和普通构造函数之间有什么区别。
var httpClient = HttpClientFactory.Create();
VS
var httpClient = new HttpClient();
在大多数示例中,我看到使用
new HttpClient()
,没有任何 using
语句,即使 HttpClient
类 派生自 IDisposable
。
由于
HttpClient
类派生自 IDisposable
,工厂是否进行了一些池化或缓存?是否有性能优势,或者并不重要?
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
工厂是一种辅助方法,当管道中有多个 DelegatingHandler 时,可以协助创建客户端。委托处理程序需要连接在一起以形成管道。该工厂允许您将处理程序作为数组传递,工厂将负责将它们连接在一起。
我相信,但不要相信我的话,CreatePipeline 方法可以在服务器端使用来为 Web API HttpServer 构建消息处理管道。
我很高兴您没有看到很多围绕 HTTPClient 使用块的示例,因为我多年来一直在与这种做法作斗争。尽管 HttpClient 确实实现了一次性,但它仅用于处理请求正在进行时被破坏的异常情况。 HttpClient 实例应该是长期存在的。处理它们会强制关闭应该池化的底层 TCP 连接。 HttpClient 是线程安全的,可以被不同线程安全地多次使用。这就是它的用途,而不是一次性使用,使用我经常看到的块模式。
中提到的
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 更改问题,这些问题已由的默认构造函数
HttpClient
IHttpClientFactory
解决。它还提供了用于增加应用程序弹性的扩展。