服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#使用HttpClient的正确方式你了解吗

C#使用HttpClient的正确方式你了解吗

2022-12-09 12:30菜鸟厚非 C#

在微服务架构体系中经常需要向特定 URL 地址发送 Http 请求操作,在 .net core 中 httpClient 使用不当会造成灾难性的问题,这篇文章主要来分享 .net core 中通过 IHttpClientFactory 工厂来使用 HttpClient 的正确打开方式

错误使用

New HttpClient

如下面一段代码,日常开发中经常使用的 call http 方式,每次 new 一个 HttpClient

?
1
using(var client = new HttpClient())

先来做一个简单的测试,循环 call 一个 url ,代码如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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 被耗尽,耗尽之后就会出现喜闻乐见的一个错误。

C#使用HttpClient的正确方式你了解吗

错误原因,对象所占用资源应该确保及时被释放掉,但是,对于网络连接而言,这是错误的,原因有如下:

  • 网络连接是需要耗费一定时间的,频繁开启与关闭连接,性能会受影响
  • 开启网络连接时会占用底层 socket 资源,但在 HttpClient 调用其本身的 Dispose 方法时,并不能立刻释放该底层 socket 资源,这意味着程序可能会因为耗尽连接资源而产生灾难性的问题

对于上面的错误,大家可能会想到使用静态单例模式的 HttpClient,接着往下看

static HttpClient

?
1
private static HttpClient Client = new HttpClient();

静态单例模式虽然可以解决上面问题,但是会带来另外一个问题:DNS 变更会导致不能解析,DNS 不会重新加载,需要重启才能变更。(这样演示相对负复杂,有兴趣的可以去尝试一下)

正确使用

HttpClientFactory 以模块化、可命名、可配置、弹性方式重建了 HttpClient 的使用方式,由 DI 框架注入 IHttpClientFactory 工厂,由工厂创建 HttpClient 并从内部的 Handler 池分配请求 Handler 。

HttpClientFactory 创建的 HttpClient,也即是 HttpClientHandler,只是这些个 HttpClien t被放到了“池子”中,工厂每次在 create 的时候会自动判断是新建还是复用 (默认生命周期为2min)。

C#使用HttpClient的正确方式你了解吗

.net core 2.1 开始引入了 IHttpClientFactory 工厂类来自动管理 IHttpClientFactory 类的创建和资源释放,可以通过 Ioc 注入方式进行使用

?
1
2
services.AddControllers();
services.AddHttpClient();

IHttpClientFactory 使用方法,简略代码如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_46785144/article/details/121456849

延伸 · 阅读

精彩推荐
  • C#C#写差异文件备份工具的示例

    C#写差异文件备份工具的示例

    这篇文章主要介绍了C#写差异文件备份工具的示例,帮助大家利用c#备份,管理文件,感兴趣的朋友可以了解下...

    黑衫老腰3632022-10-12
  • C#c# 如何实现web打印插件

    c# 如何实现web打印插件

    本文的实现思路主要是Web端通过WebSocket将Html发送给客户端,客户端(Winform)监听消息,接收处理后再打印,有该需求的朋友可以参考下本文...

    畅饮无绪9322022-11-22
  • C#Unity 读取文件 TextAsset读取配置文件方式

    Unity 读取文件 TextAsset读取配置文件方式

    这篇文章主要介绍了Unity 读取文件 TextAsset读取配置文件的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    gd_20153632022-11-13
  • C#C# 中属性PropertyInfo的setvalue用法说明

    C# 中属性PropertyInfo的setvalue用法说明

    这篇文章主要介绍了C# 中属性PropertyInfo的setvalue用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    锋璠11082022-10-28
  • C#C#及WPF获取本机所有字体和颜色的方法

    C#及WPF获取本机所有字体和颜色的方法

    这篇文章主要介绍了C#及WPF获取本机所有字体和颜色的方法,实例分析了C#及WPF获取本机字体及颜色的相关技巧,非常简单实用,需要的朋友可以参考下...

    C#教程网5942021-10-27
  • C#详解C# ConcurrentBag的实现原理

    详解C# ConcurrentBag的实现原理

    ConcurrentBag实现了IProducerConsumerCollection接口,该接口主要用于生产者消费者模式下,可见该类基本就是为生产消费者模式定制的。然后还实现了常规的...

    InCerry10752022-11-23
  • C#C# 7.0 使用下划线忽略使用的变量的原因分析

    C# 7.0 使用下划线忽略使用的变量的原因分析

    这篇文章主要介绍了C# 7.0 使用下划线忽略使用的变量的原因浅析,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参...

    林德熙10192022-03-02
  • C#c# 实现文件上传下载功能的实例代码

    c# 实现文件上传下载功能的实例代码

    这篇文章主要介绍了如何用c# 实现文件上传下载功能,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    少年。5602022-09-21