Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net HttpClientFactory.Create vs new HttpClient_.net_Dotnet Httpclient_.net 4.6 - Fatal编程技术网

.net HttpClientFactory.Create vs new HttpClient

.net HttpClientFactory.Create vs new HttpClient,.net,dotnet-httpclient,.net-4.6,.net,Dotnet Httpclient,.net 4.6,我很好奇这项研究的目的是什么。MSDN上没有说明它存在的原因(请参阅链接) 有更多的特殊参数,但我想知道没有参数的调用和普通构造函数有什么区别 var httpClient=HttpClientFactory.Create(); VS var-httpClient=new-httpClient(); 在大多数示例中,我看到使用了new HttpClient(),而没有使用语句,即使源于IDisposable 由于HttpClient类源自IDisposable,工厂是否进行了一些池或缓存

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

有更多的特殊参数,但我想知道没有参数的调用和普通构造函数有什么区别


var httpClient=HttpClientFactory.Create();
VS

var-httpClient=new-httpClient();

在大多数示例中,我看到使用了
new HttpClient()
,而没有使用
语句,即使源于
IDisposable

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

更新–.NET Core 2.1中的IHttpClientFactory 请注意,自从提出这个问题以来,.NET的较新版本已经发布,并且.NETCore2.1引入了一种新的、改进了很多的获取HTTP客户机的方法

请参考下面Ali Bayat的回答,使用
IHttpClientFactory
代替.NET Core

但是,我保留Darrel Miller的答案作为可接受的答案,因为这是在.NET Framework直到v4.8版本中使用的正确答案,为此我提出了这个问题


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

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

我相信,而且不要相信我的话,CreatePipeline方法可以在服务器端用于为webapi HttpServer构建消息处理管道


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

让我补充一下@Darreller的答案:


如果扩展对您来说很重要,那么您应该注意HttpClient实例的生命周期。请参阅IHttpClientFactory提供以下好处:

  • 命名和配置逻辑
    HttpClient
    实例
  • 构建一个传出请求中间件来管理 围绕HTTP请求的交叉关注点
  • 与Polly集成,用于瞬时故障处理
  • 通过管理
    HttpClient
    生存期,避免常见的DNS问题
  • 为通过由创建的客户端发送的所有请求添加日志记录 工厂
  • 如中所述

    HttpClient的默认构造函数


    存在套接字耗尽和DNS更改问题,这些问题由IHttpClientFactory解决。它还提供了扩展功能,用于向应用程序添加弹性。

    感谢您的回复!在深入挖掘之后,我还发现了David Faivre在其中解释了当重复更新太多的
    HttpClient
    s时可能出现的问题。@Darrel因此,如果我有一个长期运行的HttpClient,但最终我将摆脱它,此时,我是否需要手动调用dispose,或者我可以让它脱离范围,让GC来处理它?@Darrel,请注意,尽管大多数方法都是线程安全的,但实例成员不是线程安全的(就像.NET Framework中的大多数情况一样)-请参阅感谢您添加此指南,由于.NET Core中引入了
    IHttpClientFactory
    ,因此它是一个更好的选项,可以替代提出此问题时可用的选项。我很好奇.NET Core中是否有一个实际的类实现了IHttpClientFactory,一个具体的类?使用它的唯一方法似乎是使用IoC容器和调用服务DefaultHttpClientFactory@bytedev到今天为止,似乎还没有一种方法可以在不依赖微软自己的DI容器的情况下使用具体的实现。这里正在讨论这个问题:@AliBayat
    DefaultHttpClientFactory
    是一个内部类,因此您不能从自己的代码实例化它。