Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C# HttpClient使用和注意事项,.NET Framework连接池并发限制

C# HttpClient使用和注意事项,.NET Framework连接池并发限制

原创
作者头像
SpringSun
发布于 2023-02-24 01:06:48
发布于 2023-02-24 01:06:48
3.3K0
举报
文章被收录于专栏:技术赋能学术技术赋能学术

System.Net.Http.HttpClient 类用于发送 HTTP 请求以及从 URI 所标识的资源接收 HTTP 响应。 HttpClient 实例是应用于该实例执行的所有请求的设置集合,每个实例使用自身的连接池,该池将其请求与其他请求隔离开来。 从 .NET Core 2.1 开始,SocketsHttpHandler 类提供实现,使行为在所有平台上保持一致。

HttpClient实例是执行网络请求的设置集合,每个实例会使用一个连接池。通过这段描述我们知道实际使用HttpClient的时候我们只需要实例化一个就行了,在处理程序实例内池连接,并在多个请求之间重复使用连接。也就是官方提倡的使用单个实例,如果每次请求就实例化一个HttpClient,则会创建不必要的连接降低性能,并且TCP 端口不会在连接关闭后立即释放。

所以如果是大批量创建HttpClient请求则大量负载下可用的套接字数将耗尽,这种耗尽将导致 SocketException 错误。

使用方式

  1. 使用静态变量。
代码语言:txt
AI代码解释
复制
static readonly HttpClient httpClient = new HttpClient();
  1. 使用单例模式
代码语言:txt
AI代码解释
复制
    public class HttpClientInstance

    {

        private static readonly HttpClient \_HttpClient;



        static HttpClientInstance()

        {

            _HttpClient = new HttpClient();

        }



        public static HttpClient GetHttpClient()

        {

            return _HttpClient;

        }

    }

实例化参数

可以通过构造参数(如 HttpClientHandler (或 SocketsHttpHandler .NET Core 2.1 或更高版本) )作为构造函数的一部分来配置其他选项。 实例化HttpClient后无法更连接属性,因此,如果需要更改连接属性,则需要创建新的 HttpClient 实例。

配置可以在构造期间配置 HttpClientHandler 或 SocketsHttpHandler 传入,SocketsHttpHandler可以设置额外参数包括 MaxConnectionsPerServer, PooledConnectionIdleTimeout、PooledConnectionLifetime、ConnectTimeout。

  • MaxConnectionsPerServer:HttpClient 对象所允许的最大并发连接数。
  • PooledConnectionIdleTimeout: PooledConnectionLifetime 指定的时间范围过后,系统会关闭连接,然后创建一个新连接。
  • PooledConnectionLifetime:指定要用于连接池中每个连接的超时值。 如果连接处于空闲状态,则连接会立即关闭;否则,连接在当前请求结束时关闭。
  • ConnectTimeout:指定在请求需要创建新的 TCP 连接时使用的超时。 如果发生超时,将取消请求 Task<TResult> 。
代码语言:txt
AI代码解释
复制
var handler = new SocketsHttpHandler

{

    PooledConnectionLifetime = TimeSpan.FromMinutes(15)

};

var httpClient = new HttpClient(handler);

在.NET Framework 只能使用HttpClientHandler,且没有PooledConnectionIdleTimeout和PooledConnectionLifetime等参数。

代码语言:txt
AI代码解释
复制
HttpClientHandler httpClientHandler = new HttpClientHandler();

//最大并发连接数

httpClientHandler.MaxConnectionsPerServer = 100;



HttpClient httpClient=new HttpClient(httpClientHandler);

//超时设置

httpClient.Timeout = new TimeSpan(5000);

可以是设置MaxConnectionsPerServer,可以设置Timeout。Timeout 为来自 HttpClient 实例的所有 HTTP 请求设置默认超时。 超时仅适用于导致启动请求/响应的 xxxAsync 方法。 如果达到超时,则会 Task<TResult> 取消该请求。这个超时时间是包含从请求到响应的整个时间段,而不像上面参数可以设置连接超时。

##请求实现

HttpClient这是一个高级 API,用于包装其运行的每个平台上可用的较低级别功能。

在每个平台上, HttpClient 尝试使用最佳可用传输:

注意事项

在上面实现可以看到在不同的框架下HttpClient的实现是不一样的,在.NET Framework下是使用HttpWebRequest支持。

所以还会受限HttpWebRequest的实现,如果我们要启用多线程高频率调用接口,那么这里要注意HttpWebRequest的连接并发的数量限制。HttpWebRequest通过ServicePoint设置,我们通过反编译看到HttpWebRequest构造函数。

ServicePoint.DefaultConnectionLimit获取允许的最大并发连接数。 对于 ASP.NET 托管的应用程序,默认连接限制为 10,对于所有其他应用程序,默认连接限制为 2。DefaultConnectionLimit 对现有 ServicePoint 对象没有影响;它只影响更改后初始化的对象。如果未直接或通过配置设置此属性的值,则该值默认为常量 DefaultPersistentConnectionLimit

如果是应用连接池默认只有2个并发,所以当你启用很多线程的时候实际效率是不会提升的,一直只有两个并发在阻塞排队,如果请求比较耗时后面的请求还有异常的可能。

因此当你使用多线程的时候要注意初始化HttpClient的httpClientHandler.MaxConnectionsPerServer = n;该参数用于设置。

RestSharp

平时我们可能使用RestSharp 用于网络请求,实际也是在HttpWebRequest上的封装,在官网我们可以看到如下说明:

在最新的v107换成了HttpClient,以前的版本也是HttpWebRequest。如果要设置RestSharp的连接池并发数需要修改默认值。

代码语言:txt
AI代码解释
复制
System.Net.ServicePointManager.DefaultConnectionLimit = n;

然后再实例化RestClient。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
天气免费API接口,天气API接口请求讲解及源码下载
文章来源:https://www.sojson.com/blog/349.html
全是为了他
2019/12/16
6K0
天气免费API接口,天气API接口请求讲解及源码下载
Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
Java_老男孩
2019/12/02
11.6K1
手把手讲解Spring中的Http请求神器RestTemplate
Java 中关于 Http 请求的工具实际上非常多,自带的 HttpUrlConnection,古老的 HttpClient,后起之秀 OkHttp 等,除了这些之外,还有一个好用的工具--RestTemplate,这是 Spring 中就开始提供的 Http 请求工具,不过很多小伙伴们可能是因为 Spring Cloud 才听说它。今天我们就来聊一聊这个 RestTemplate。
江南一点雨
2020/02/21
2.8K0
手把手讲解Spring中的Http请求神器RestTemplate
SpringBoot使用RestTemplate访问第三方接口
相信大家都知道如何在自己的项目里面调用自己的接口,只需要调用自己项目里面接口特定的URL地址就行了,但是如果是调用其他项目的接口呢,这时候如果是直接调用的话,很明显我们是不能够调用的.肯定是要通过某个工具才能够进行访问的.我们可以通过下面这张图来理解.
萌萌哒的瓤瓤
2021/01/13
3.8K0
SpringBoot使用RestTemplate访问第三方接口
Spring之RestTemplate使用小结一
作为一个Java后端,需要通过HTTP请求其他的网络资源可以说是一个比较常见的case了;一般怎么做呢?
一灰灰blog
2018/08/13
6.5K0
Spring之RestTemplate使用小结一
SpringBoot系列之RestTemplate使用示例
博主之前经常对接一些接口,所以发现写一些http请求比较麻烦,学习springboot的过程知道可以用RestTemplate来做http请求,RestTemplate是Spring Framework框架封装的基于模板方法设计模式的一个工具类,带有同步模板方法 API 的原始 Spring REST 客户端类,下面博主分析一些对接过程的一些经验,RestTemplate基本使用可以参考官网文档:https://docs.spring.io/spring-framework/docs/5.1.6.RELEASE/spring-framework-reference/integration.html#rest-client-access
SmileNicky
2022/05/07
1.6K0
SpringBoot系列之RestTemplate使用示例
RestTemplate的应用
Spring提供了一种简单便捷的模板类 RestTemplate 来调用 RESTful 接口。它提供了多种便捷访问HTTP服务的方法,能够大大提高客户端的编写效率。
砒霜拌辣椒
2023/08/23
2890
Spring RestTemplate中几种常见的请求方式
当我们从服务消费端去调用服务提供者的服务的时候,使用了一个很好用的对象,叫做RestTemplate,当时我们只使用了RestTemplate中最简单的一个功能getForEntity发起了一个get请求去调用服务端的数据,同时,我们还通过配置@LoadBalanced注解开启客户端负载均衡,RestTemplate的功能不可谓不强大,那么今天我们就来详细的看一下RestTemplate中几种常见请求方法的使用。
田维常
2019/07/16
3.5K0
Spring RestTemplate中几种常见的请求方式
详解 RestTemplate 操作
作为开发人员,我们经常关注于构建伟大的软件来解决业务问题。数据只是软件完成工作时  要处理的原材料。但是如果你问一下业务人员,数据和软件谁更重要的话,他们很可能会选择  数据。数据是许多业务的生命之血。软件通常是可以替换的,但是多年积累的数据是永远不能  替换的。
业余草
2019/01/21
3.1K0
详解 RestTemplate 操作
Java中restTemplate的使用
原文链接 GitHub项目地址 Gitee项目地址 本文介绍restTemplate基础用法。 Java中get和post的用法请参考:Java中Get和Post的使用 1 提供get/post接口 1.1 Controller @RestController @RequestMapping("/homepage") public class MyController { @Autowired MyService myService; // 提供get接口 @GetMap
代码的路
2023/03/21
6580
总结:使用 RestTemplate 发送HTTP请求
一般发送HTTP请求是使用 Apache的HttpClient,它比较灵活。在 spring cloud 中往往提供的 REST 风格的服务。RestTemplate 提供了一种简单便捷的模板类来进行HTTP操作的方式。
张云飞Vir
2021/05/18
3.2K0
重学springboot系列番外篇之RestTemplate
RestTemplate是执行HTTP请求的同步阻塞式的客户端,它在HTTP客户端库(例如JDK HttpURLConnection,Apache HttpComponents,okHttp等)基础封装了更加简单易用的模板方法API。也就是说RestTemplate是一个封装,底层的实现还是java应用开发中常用的一些HTTP客户端。但是相对于直接使用底层的HTTP客户端库,它的操作更加方便、快捷,能很大程度上提升我们的开发效率。
大忽悠爱学习
2021/12/15
4.8K0
重学springboot系列番外篇之RestTemplate
Spring Cloud Ribbon负载均衡
Spring Cloud Ribbon负载均衡一、简介二、客户端负载均衡三、RestTemplate详解GET请求POST请求PUT请求DELETE请求
cxuan
2019/06/03
6820
Spring Cloud Ribbon:负载均衡的服务调用
在微服务架构中,很多服务都会部署多个,其他服务去调用该服务的时候,如何保证负载均衡是个不得不去考虑的问题。负载均衡可以增加系统的可用性和扩展性,当我们使用RestTemplate来调用其他服务时,Ribbon可以很方便的实现负载均衡功能。
macrozheng
2019/09/17
8120
Spring之RestTemplate中级使用篇
前面一篇介绍了如何使用RestTemplate发起post和get请求,然而也只能满足一些基本的场景,对于一些特殊的如需要设置请求头,添加认证信息等场景,却没有提及可以怎么做,这一篇则相当于进阶版,将主要介绍
一灰灰blog
2018/08/15
2.6K0
Spring之RestTemplate中级使用篇
Spring3 RestTemplate
RestTemplate是执行HTTP请求的同步阻塞式的客户端,它在HTTP客户端库(例如JDK HttpURLConnection,Apache HttpComponents,okHttp等)基础封装了更加简单易用的模板方法API。也就是说RestTemplate是一个封装,底层的实现还是java应用开发中常用的一些HTTP客户端。但是相对于直接使用底层的HTTP客户端库,它的操作更加方便、快捷,能很大程度上提升我们的开发效率。
HLee
2021/04/25
3.3K0
Spring3 RestTemplate
HTTP对接方式
当前方式主要是通过构造HTTP请求进行对第三方接口进行调用,返回JSON数据,为了方便起见可以使用HTTPUtil对常用的请求方式进行封装,在进行调用时直接传参构造请求即可。
关忆北.
2020/10/15
1.4K0
RestTemplate 用法详解「建议收藏」
上篇文章带大家学习了一下基本的微服务环境搭建,由 provider 提供服务, consumer 通过 DiscoveryClient 先去 eureka 上获取 provider 的服务的地址,获取到地址之后再去调用相关的服务。在服务的调用过程中,使用到了一个工具,叫做 RestTemplate,RestTemplate 是由 Spring 提供的一个 HTTP 请求工具。在上文的案例中,开发者也可以不使用 RestTemplate ,使用 Java 自带的 HttpUrlConnection 或者经典的网络访问框架 HttpClient 也可以完成上文的案例,只是在 Spring 项目中,使用 RestTemplate 显然更方便一些。在传统的项目架构中,因为不涉及到服务之间的调用,大家对 RestTemplate 的使用可能比较少,因此,本文我们就先来带领大家来学习下 RestTemplate 的各种不同用法,只有掌握了这些用法,才能在微服务调用中随心所欲地发送请求。
全栈程序员站长
2022/11/01
3.7K0
精讲RestTemplate第4篇-POST请求方法使用详解
在上一节为大家介绍了RestTemplate的GET请求的两个方法:getForObject()和getForEntity()。其实POST请求方法和GET请求方法上大同小异,RestTemplate的POST请求也包含两个主要方法:
字母哥博客
2020/09/23
12.9K0
精讲RestTemplate第4篇-POST请求方法使用详解
springcloud笔记(一) Eurake和Ribbon,RestTemplate 的学习与测试案例
以上只是有两个项目,一个项目A 调用B项目,在A项目里面写死B项目的地址进行调用;
一写代码就开心
2022/05/09
6210
springcloud笔记(一) Eurake和Ribbon,RestTemplate 的学习与测试案例
推荐阅读
相关推荐
天气免费API接口,天气API接口请求讲解及源码下载
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档