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

这篇具有很好参考价值的文章主要介绍了在.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
   //欢迎公众号:DOTNET开发跳槽

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

在这里可以看到状态“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
        }
//欢迎公众号:DOTNET开发跳槽

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

builder.Services.AddHttpClient();

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

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

结语

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

源码地址:https://github.com/xbhp/webapitest

参考:微软官方文档文章来源地址https://www.toymoban.com/news/detail-411471.html

来源公众号:DotNet开发跳槽

到了这里,关于在.NET Core使用 HttpClient 的正确方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C# .NET 】使用 Entity Framework Core 操作sqlite数据库

    添加包 EF Core design package   NuGet Gallery | Home 使用用于 EF Core 迁移和现有数据库中的反向工程(基架)的工具需要安装相应的工具包: 可在 Visual Studio 包管理器控制台中使用的 PowerShell 工具的 Microsoft.EntityFrameworkCore.Tools 跨平台命令行工具的 dotnet-ef 和 Microsoft.EntityFramewor

    2024年02月14日
    浏览(53)
  • 微软.NET、.NET Framework和.NET Core联系和区别

    我是荔园微风,作为一名在IT界整整25年的老兵,看到不少初学者在学习编程语言的过程中如此的痛苦,我决定做点什么,我小时候喜欢看小人书(连环画),在那个没有电视、没有手机的年代,这是为数不多的课余生活方式这一。我画的不好,但是如果能帮大家理解编程语言

    2024年01月16日
    浏览(61)
  • .net framework、.net standard、 .net core .net 5/6 区别

    之前一直使用.net framework框架编写程序,这几年微软的动作有点大,更新迭代的有些快,对出现的.net standard、 .net core 、.net 5/6框架一直搞不清是什么关系,今天整理下这几个框架的关系。 物联网时代到来,各种跨平台的需求原来越强烈,.net framework框架只能在windows上运行,

    2024年02月08日
    浏览(60)
  • 什么是.NET?什么是.NET Core?以及什么是.NET Framework,.NET和.NET Core区别又是什么呢?

    概述 对于.NET平台的初学者来说,有时候比较困惑“什么是.NET?什么是.NET Core?.NET和.NET Core区别又是什么呢?”。确实,目前微软的开发平台有两种不同的.NET运行时环境,一种是.NET Framework,另一种则是.NET Core(.NET 5),不同的目标框架运行时环境不同。 那这两者的区别到底是

    2024年02月06日
    浏览(63)
  • 【c#,.NET】Entity Framework Core基础详解

    目录   一、EF Core概述 1.1 什么是ORM?  1.2 EF Core的性能怎么样  二、EF Core入门 2.1 什么是Migration数据库迁移: 2.2  EF Core数据的增删改查 2.2.1 增加数据 2.2.2 查询数据  2.2.3 修改和删除数据 三、EF Core的实体类配置 3.1 约定大于配置 3.2 EF Core两种配置方式 3.2.1 Data Annotation 3.2.2 

    2024年02月04日
    浏览(65)
  • .Net Core Entity Framework Core 的基础封装 -数据库操作拦截器

    自己制作的一个基于Entity Framework Core 的数据库操作拦截器,可以打印数据库执行sql,方便开发调试,代码如下: 运行结果如下:  

    2024年02月22日
    浏览(52)
  • 解决安装了.NET Core或.NET Framework 或 ,但代码无提示(注释)问题

    1、进入微软官方下载页面:https://dotnet.microsoft.com/zh-cn/download/intellisense 2、找到对应的.NET版本和适用于 Windows 的本地化 IntelliSense 下载安装即可。 详细安装可以参考:https://docs.microsoft.com/zh-cn/dotnet/core/install/localized-intellisense?WT.mc_id=dotnet-35129-website 1、进入微软官方下载页面:

    2024年02月08日
    浏览(45)
  • ASP.Net Core Web API结合Entity Framework Core框架(API的创建使用,接口前端权限设置,前端获取API的Get,post方法)(程序包引用以及导入数据库)

    目录 1. Web Api 程序包引用 2. Web Api 的创建与Http类型的介绍 2.1 ASP.Net Core Web API项目的创建 2 .2  API接口的创建 2.3 HttpGet和HttpPost类型的区别 3.接口权限设置 4.HttpGet方法和HttpPOst方法 5.前端中用HttpGet/Poset获取接口数据 6.EF框架——配置数据库链接字符串(即将数据库中的表导入项

    2024年02月08日
    浏览(67)
  • .NET7使用HttpClient实现查询天气预报接口

    朋友做网站需要根据城市展示天气预报,找了一圈没有找到靠谱的接口,今天在中央气象台的官网查询某个城市找到了接口,先用postman试了一下居然可以使用,可以查询某个城市7天的天气预报等信息。但是查询编码是气象台自己的编码,在网上搜索了一下居然有这个编码。

    2023年04月14日
    浏览(52)
  • .Net6与Framework不同方式获取文件哈希值的性能对比

    算法:MD5、SHA1、SHA256、SHA384、SHA512 文件数:200 平台对比:.NET 6 vs .NET Framework 4.7.2 .NET 6 的性能确实远比.NET Framework要高; SHA1 性能最高,MD5次之,另外几种算法性能远低前两者;

    2024年02月07日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包