目录错误使用New HttpClientstatic HttpClient正确使用错误使用 New HttpClient 如下面一段代码,日常开发中经常使用的 call http 方
如下面一段代码,日常开发中经常使用的 call http 方式,每次 new 一个 HttpClient
using(var client = new HttpClient())
先来做一个简单的测试,循环 call 一个 url ,代码如下
public async Task<string> GetXXXUrlAsync(string url)
{
var html = "";
for (var i = 0; i < 20; i++)
{
using (var client = new System.net.Http.HttpClient())
{
var result=await client.GetStringAsync(url);
html += result;
}
}
return html;
}
运行项目输出结果后,通过 netstate 查看下 tcp 连接情况
C:\windows\System32> netstat
虽然项目已经运行结束,但是连接依然存在,状态为" TIME_WAIT"(继续等待看是否还有延迟的包会传输过来;默认在 windows 下,TIME_WAIT 状态将会使系统将会保持该连接 240s。在高并发的情况下,连接来不及释放,Socket 被耗尽,耗尽之后就会出现喜闻乐见的一个错误。
错误原因,对象所占用资源应该确保及时被释放掉,但是,对于网络连接而言,这是错误的,原因有如下:
对于上面的错误,大家可能会想到使用静态单例模式的 HttpClient,接着往下看
private static HttpClient Client = new HttpClient();
静态单例模式虽然可以解决上面问题,但是会带来另外一个问题: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 使用方法,简略代码如下
private readonly IHttpClientFactory _clientFactory;
public HomeController(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task<string> GetBaiduAsync(string url)
{
var client = _clientFactory.CreateClient();
var result = await client.GetStringAsync(url);
return result;
}
到此这篇关于C#使用HttpClient的正确方式你了解吗的文章就介绍到这了,更多相关C# HttpClient内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: C#使用HttpClient的正确方式你了解吗
本文链接: https://www.lsjlt.com/news/157980.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0