C#如何使用HttpClient
导读:本文共1909字符,通常情况下阅读需要6分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 错误使用New HttpClient如下面一段代码,日常开发中经常使用的 call http 方式,每次 new 一个 HttpClientusing(varclient=newHttpClient())先来做一个简单的测试,循环 call 一个 url ,代码如下publicasyncTask<string>GetXXXUrlAsync(strin... ...
目录
(为您整理了一些要点),点击可以直达。错误使用
New HttpClient
如下面一段代码,日常开发中经常使用的 call http 方式,每次 new 一个 HttpClient
using(varclient=newHttpClient())
先来做一个简单的测试,循环 call 一个 url ,代码如下
publicasyncTask<string>GetXXXUrlAsync(stringurl){varhtml="";for(vari=0;i<20;i++){using(varclient=newSystem.Net.Http.HttpClient()){varresult=awaitclient.GetStringAsync(url);html+=result;}}returnhtml;}
运行项目输出结果后,通过 netstate 查看下 TCP 连接情况
C:\Windows\System32> netstat
虽然项目已经运行结束,但是连接依然存在,状态为" TIME_WAIT"(继续等待看是否还有延迟的包会传输过来;默认在 windows 下,TIME_WAIT 状态将会使系统将会保持该连接 240s。在高并发的情况下,连接来不及释放,socket 被耗尽,耗尽之后就会出现喜闻乐见的一个错误。
错误原因,对象所占用资源应该确保及时被释放掉,但是,对于网络连接而言,这是错误的,原因有如下:
网络连接是需要耗费一定时间的,频繁开启与关闭连接,性能会受影响
开启网络连接时会占用底层 socket 资源,但在 HttpClient 调用其本身的 Dispose 方法时,并不能立刻释放该底层 socket 资源,这意味着程序可能会因为耗尽连接资源而产生灾难性的问题
对于上面的错误,大家可能会想到使用静态单例模式的 HttpClient,接着往下看
static HttpClient
privatestaticHttpClientClient=newHttpClient();
静态单例模式虽然可以解决上面问题,但是会带来另外一个问题:DNS 变更会导致不能解析,DNS 不会重新加载,需要重启才能变更。(这样演示相对负复杂,有兴趣的可以去尝试一下)
正确使用
HttpClientFactory 以模块化、可命名、可配置、弹性方式重建了 HttpClient 的使用方式,由 DI 框架注入 IHttpClientFactory 工厂,由工厂创建 HttpClient 并从内部的 Handler 池分配请求 Handler 。
HttpClientFactory 创建的 HttpClient,也即是 HttpClientHandler,只是这些个 HttpClien t被放到了“池子”中,工厂每次在 create 的时候会自动判断是新建还是复用 (默认生命周期为2min)。
.net core 2.1 开始引入了 IHttpClientFactory 工厂类来自动管理 IHttpClientFactory 类的创建和资源释放,可以通过 Ioc 注入方式进行使用
services.AddControllers();services.AddHttpClient();
IHttpClientFactory 使用方法,简略代码如下
privatereadonlyIHttpClientFactory_clientFactory;publicHomeController(IHttpClientFactoryclientFactory){_clientFactory=clientFactory;}publicasyncTask<string>GetBaiduAsync(stringurl){varclient=_clientFactory.CreateClient();varresult=awaitclient.GetStringAsync(url);returnresult;}
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
C#如何使用HttpClient的详细内容,希望对您有所帮助,信息来源于网络。