iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#使用HttpClient的正确方式你了解吗
  • 182
分享到

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

2024-04-02 19:04:59 182人浏览 独家记忆
摘要

目录错误使用New HttpClientstatic HttpClient正确使用错误使用 New HttpClient 如下面一段代码,日常开发中经常使用的 call http 方

错误使用

New HttpClient

如下面一段代码,日常开发中经常使用的 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 被耗尽,耗尽之后就会出现喜闻乐见的一个错误。

在这里插入图片描述

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

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

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

static 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文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-15
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-15
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-15
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-15
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-15
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-15
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-15
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-15
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-15
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-15
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作