.net - HttpClientFactory.Create 与新的 HttpClient

标签 .net dotnet-httpclient .net-4.6

我很好奇 HttpClientFactory class 的目的是什么? 。 MSDN 上没有说明它为何存在(请参阅链接)。

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

<小时/>
var httpClient = HttpClientFactory.Create();

VS

var httpClient = new HttpClient();
<小时/>

在大多数示例中,我看到使用 new HttpClient(),而没有任何 using 语句,即使 HttpClient class派生自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

最佳答案

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

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

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

关于.net - HttpClientFactory.Create 与新的 HttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18976042/

相关文章:

.net - 您更喜欢 .net 中的哪种配置方法?为什么?

c# - .NET 6 在 Web API 项目 Controller 中使用 HTTP 客户端进行 API 调用

c# - 通用应用程序缺少 WriteableBitmap SaveJpeg

c# - XML 命名空间别名不可知的 .NET XML 读取器/解析

c# - 逐字输出字符串属性以防止双重编码

c# - 是否可以在 Web 服务调用时在客户端机器上创建 cookie?

c# - 通过传递简单和复杂的参数来调用 web api

azure-devops - .Net 4.6 升级后 Visual Studio 测试步骤的 CI 构建错误 - 执行程序进程退出;在 net.pipe 上没有监听端点

.net - SQL Azure : SSL Provider, 错误:0 - 等待操作超时

c# - TFS 2013 不会构建 .NET Framework 4.6 项目