在.NET Core中正确使用HttpClient的方式

HttpClient 是 .NET Framework、.NET Core 或 .NET 5以上版本中的一个类,用于向 Web API 发送 HTTP 请求并接收响应。它提供了一些简单易用的方法,如 GET、POST、PUT 和 DELETE,可以很容易地构造和发送 HTTP 请求,并处理响应数据。它是我们比较常用的官方HTTP请求组件,那么你们都正确使用了吗?本文将探讨HttpClient的正确使用。

环境准备

首先我们用vs2022创建一个带默认 WeatherForcast 模板的 Web API 应用程序,以及一个普通的API的程序,项目使用的是.NET6。

项目结构如下

 

 

两个项目的功能点:

HttpClientTest - 返回天气预报的Web API

HttpClientTest2 -这个项目将用HttpClient来请求HttpClientTest 的天气预备。

接下来我们用4种方法来说明HttpClient的正确使用方法。

方法1

我们首先在HttpClientTest2 创建HttpClientTestController类,并写一个请求天气预备的方法,代码如下:

namespace HttpClientTest2.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class HttpClientTestController : ControllerBase
    {
        [HttpGet]
        public async Task<string> TestHttpClient()
        {
            var url = "https://localhost:7281/WeatherForecast";
            #region 版本1
            var httpClient = new HttpClient();
            var response = await httpClient.GetAsync(url);
            return await response.Content.ReadAsStringAsync();
            #endregion
          }
       }
   }    

 代码写完后,我们设置多项目启动,让这两个项目同时启动。

 

 

项目启动后,执行项目HttpClientTest2 的TestHttpClient请求接口。多执行几次。主要看看HttpClient后台的执行情况。这里可以用netstat来检查http的请求情况。

打开一个CMD控制台程序。输入如下代码:

netstat -na | find "7281"

7281端口是我们请求站点HttpClientTest。多次点击的效果如下:

 

 

由上面可以看出有多个请求,说明请求未关闭。接下来换第二种方法。

方法2

使用using命令来实现请求结束关闭请求,代码如下:

   #region 版本2
    using (var httpClient = new HttpClient())
   {
        var response = await httpClient.GetAsync(url);
        return await response.Content.ReadAsStringAsync();
   }
   #endregion

 同样我们多次请求,结果如下:

 

在这里可以看到状态“TIME_WAIT”,说明链接已经关闭,但实际情况链接还是占用着端口,在资源耗尽才会释放。这就是套连接的问题,套接字耗尽是指服务器上的可用套接字资源已经全部被占用,无法为新的连接提供服务。在 TCP/IP 网络通信中,每个端口上最多只能建立一个连接,这就限制了服务器可以处理的连接数。当服务器负载过高时,就可能导致套接字资源紧张,进而引发套接字耗尽问题。针对上面问题,继续对HttpClient 改进。

方法3

这里我们使用单例模式试一试。代码如下:

public class HttpClientTestController : ControllerBase
    {
        private static HttpClient _httpClient;
        static HttpClientTestController()
        {
            _httpClient = new HttpClient();
        }
        //注意:有许多方法可以实现单例模式。在这里使用了静态实例方法。
        [HttpGet]
        public async Task<string> TestHttpClient()
        {
            var url = "https://localhost:7281/WeatherForecast";
            #region 版本3
            //var response = await _httpClient.GetAsync(url);
            //return await response.Content.ReadAsStringAsync();
            #endregion
        }
    }

 代码编写完成后我们再试一试,结果如下:

 

 

因为使用了单例模式,没有创建新实例使用了相同的连接。这种方法解决了套接字耗尽问题。但是,我们注意到有一个状态为“已建立”的开放连接。如果有DNS更改或与网络相关的更改可能会影响连接,应用程序可能会失败,需要重新启动应用程序才能解决。这个方法也不是最理想的。

方法4

HttpClient是.NET内置方法,这里可以通过使用 IHttpClientFactory 接口来实现,从而避免上面的问题。代码如下:

public class HttpClientTestController : ControllerBase
    {
        private readonly IHttpClientFactory _httpClientFactory;
        public HttpClientTestController(IHttpClientFactory httpClientFactory)
        {
            _httpClientFactory = httpClientFactory;
        }
        [HttpGet]
        public async Task<string> TestHttpClient()
        {
            var url = "https://localhost:7281/WeatherForecast";
            #region 版本4
            var httpClient = _httpClientFactory.CreateClient();
            var response = await httpClient.GetAsync(url);
            return await response.Content.ReadAsStringAsync();
            #endregion
        }

 使用IHttpClientFactory 的话,需要在Program.cs 中注入,代码如下:

builder.Services.AddHttpClient();

 同样多次请求,然后执行netstat命令。效果如下:

 

 

从请求的状态来看,通过使用 _httpClientFactory.CreateClient() 完美解决问题。

总结

本文用四种方法渐进讲述了HttpClient的使用方法以及在使用过程中的问题,最终用IHttpClientFactory解决了出现的问题。希望本文对你有所收获,欢迎留言或者吐槽。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/15340.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Excel统计分析插件】上海道宁为您提供统计分析、数据可视化和建模软件——Analyse-it

Analyse-it是Microsoft Excel中的 统计分析插件 它为Microsoft Excel带来了 易于使用的统计软件 Analyse-it在软件中 引入了一些新的创新统计分析 Analyse-it与 许多Excel加载项开发人员不同 使用完善的软件开发和QA实践 包括单元/集成/系统测试 敏捷开发、代码审查 …

虹科案例|虹科Micronor光纤传感器,实现核磁共振新应用!

PART 1 背景介绍 光纤传感器已成为推动MRI最新功能套件升级和新MRI设备设计背后的关键技术。将患者的某些活动与MRI成像系统同步是越来越受重视的需求。磁场强度随着每一代的发展而增大&#xff0c;因此&#xff0c;组件的电磁透明度在每一代和新应用中变得更加重要。 光学传…

《Netty》从零开始学netty源码(四十六)之PooledByteBuf

PooledByteBuf Netty中一大块内存块PoolChunk默认大小为4MB&#xff0c;为了尽可能充分利用内存会将它切成很多块PooledByteBuf&#xff0c;PooledByteBuf的类关系图如下&#xff1a; PooledUnsafeDirectByteBuf与PooledUnsafeHeapByteBuf直接暴露对象的底层地址。 PooledByt…

【英语】100个句子记完7000个托福单词

其实主要的7000词其实是在主题归纳里面&#xff0c;不过过一遍100个句子也挺好的&#xff0c;反正也不多。 文章目录 Sentence 01Sentence 02Sentence 03Sentence 04Sentence 05Sentence 06Sentence 07Sentence 08Sentence 09Sentence 10Sentence 11Sentence 12Sentence 13Sent…

数据分析中常见标准的参考文献

做数据分析过程中&#xff0c;有些分析法方法的标准随便一搜就能找到&#xff0c;不管是口口相传还是默认&#xff0c;大家都按那样的标准做了。日常分析不细究出处还可以&#xff0c;但是正式的学术论文你需要为你写下的每一句话负责&#xff0c;每一个判断标准都应该有参考文…

Docker | 解决docker 容器中csv文件乱码的情况

问题描述&#xff1a;在Ubuntu docker容器中&#xff0c;打开.csv文件时显示乱码 问题如图 错误分析&#xff1a; 用locale查看所用容器支持的字符集 从输出可以看到&#xff0c;系统使用的是POSIX字符集&#xff0c;POSIX字符集是不支持中韩文的&#xff0c;而UTF-8是支持中…

刷题4.28

1、 开闭原则软件实体&#xff08;模块&#xff0c;类&#xff0c;方法等&#xff09;应该对扩展开放&#xff0c;对修改关闭&#xff0c;即在设计一个软件系统模块&#xff08;类&#xff0c;方法&#xff09;的时候&#xff0c;应该可以在不修改原有的模块&#xff08;修改关…

vue之--使用TypeScript

搭配 TypeScript 使用 Vue​ 像 TypeScript 这样的类型系统可以在编译时通过静态分析检测出很多常见错误。这减少了生产环境中的运行时错误&#xff0c;也让我们在重构大型项目的时候更有信心。通过 IDE 中基于类型的自动补全&#xff0c;TypeScript 还改善了开发体验和效率。…

【Android Framework (八) 】- Service

文章目录 知识回顾启动第一个流程initZygote的流程system_serverServiceManagerBinderLauncher的启动AMS 前言源码分析1.startService2.bindService 拓展知识1:Service的两种启动方式对Service生命周期有什么影响&#xff1f;2:Service的启动流程3:Service的onStartCommand返回…

nginx(七十二)nginx中与cookie相关的细节探讨

背景知识铺垫 一 nginx中与cookie相关 ① Cookie请求头内容回顾 cookie的形式和属性 ② nginx获取cookie值的两种方法 1) $http_cookie -->获取Cookie请求头"所有值"2) $COOKIE_flag -->获取Cookie请求头的"某个key"[1]、脱敏场景在日志中只…

榜上有名 | 创宇盾荣登“2023 IT市场权威榜单”!

4月20日&#xff0c;已连续成功举办23届的IT市场年会在北京举行&#xff0c;作为权威咨询机构赛迪主办&#xff0c;中国IT业界延续时间最长的年度盛会之一&#xff0c;“2023 IT市场年会”隆重发布重磅权威榜单。 创宇盾作为云防护领域专业防护产品&#xff0c;在国家经济产业…

零成本教你部署一个ChatGPT网站

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

为何电商这么难做…...你是否忽略了这个问题?

物流时效是影响买家体验的重要环节&#xff0c;物流服务优劣也是买家网上购物时的重要参考依据。但电商企业对于快递公司的时效承诺、服务质量基本处于被动接受的状况&#xff0c;直到买家投诉才知道快递公司服务缺失&#xff0c;若买家不投诉也没法主动知道大量的订单是否按约…

Excel技能之实用技巧,高手私藏

今天来讲一下Excel技巧&#xff0c;工作常用&#xff0c;高手私藏。能帮到你是我最大的荣幸。 与其加班熬夜赶进度&#xff0c;不如下班学习提效率。能力有成长&#xff0c;效率提上去&#xff0c;自然不用加班。 消化吸收&#xff0c;工作中立马使用&#xff0c;感觉真不错。…

随手记录:Livox 时间戳修改为ROS时间戳

参考与前言 传感器类型&#xff1a;Livox-Mid70 参考链接&#xff1a;Ubuntu20.04系统安装Livox ROS Driver 官方驱动&#xff1a;https://github.com/Livox-SDK/livox_ros_driver 碎碎念&#xff1a;之所以要改成rostime主要是 提取pcd的时候发现这个timestamp 300.xxx 打…

史上最全Maven教程(三)

文章目录 &#x1f525;Maven工程测试_Junit使用步骤&#x1f525;Maven工程测试_Junit结果判定&#x1f525;Maven工程测试_Before、After&#x1f525;依赖冲突调解_最短路径优先原则&#x1f525;依赖冲突调解_最先声明原则&#x1f525;依赖冲突调解_排除依赖、锁定版本 &a…

ByteHouse云数仓版查询性能优化和MySQL生态完善

ByteHouse云数仓版是字节跳动数据平台团队在复用开源 ClickHouse runtime 的基础上&#xff0c;基于云原生架构重构设计&#xff0c;并新增和优化了大量功能。在字节内部&#xff0c;ByteHouse被广泛用于各类实时分析领域&#xff0c;最大的一个集群规模大于2400节点&#xff0…

2023年6月CDGP数据治理专家认证报名及费用

目前6月DAMA-CDGP数据治理认证考试开放报名地区有&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特。 目前南京、济南、西安、杭州等地区还在接近开考人数中&#xff0c;打算参加6月考试的朋友们可以抓紧时间报名啦&#xff01;&#xff01;&#xff01; DAMA认证为数据管…

肝一肝设计模式【二】-- 工厂模式

系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 文章目录 系列文章目录前言一、简单工厂模式二、工厂方法模式三、抽象工厂模式写在最后 前言 在实际开发过程中&#xff0c;构建对象往往使用new的方式来构建&#xff0c;但随着…

【社区图书馆】PyTorch高级机器学习实战 读书感想

《PyTorch高级机器学习实战》十大特点 1. 深入全面的内容覆盖&#xff1a; 本书的内容深入而全面&#xff0c;涵盖了深度学习中的多个领域&#xff0c;包括自然语言处理、计算机视觉、强化学习等&#xff0c;并介绍了各种不同的神经网络结构和优化算法。 2. 理论和实践并重&am…