HttpClient实例是否应该释放掉?

  从源代码中可以的看到httpClient类最上层实现了IDisposable接口,看到该接口我们下意识就是要用using(自动释放)代码块包含起、或者自己手动调用Disposable方法释放。

如:

using(var conn = new SqlConnection(connStr))
{ }

这种使用方式是十分正确的,但是由于SqlConnection是比较特殊,这里程序并不会真正的把Connection给释放掉,而是把它丢进连接池(ConnectionPool)中,后面使用的时候在取出来。

所以这时候问题就来了,httpClient并没有ConnectionPool实现,所以当我们Disposables时它会以 TIME_WAIT的状态继续存活240秒,当程序在短时间内大量创建httpClient对象并销毁时,会占用过多的系统内容,严重的还有可能会消耗完socket port,导致无法建立新的连接。所以我们应该重复使用httpClient对象。

这句话来自官网:    HttpClient用于在应用程序的整个生存期内实例化一次并重复使用。 实例化每个请求的 HttpClient 类将耗尽重负载下可用的插槽数。 这将导致 SocketException 错误。 下面是正确使用 HttpClient 的示例。 

public class GoodController : ApiController
{
private static readonly HttpClient HttpClient; static GoodController()
{
HttpClient = new HttpClient();
}
}

https://docs.microsoft.com/zh-cn/dotnet/api/system.net.http.httpclient?view=netframework-4.8&viewFallbackFrom=netframework-4

共用一个 HttpClient 实例的副作用

共用静态HttpClient 可共用连线避免TIME_WAIT 连线残留,但这也衍生新问题- 当HttpClient 使用xxx.yyy.zzz DNS 名称连上网站,它会记忆DNS 解析结果,
但因缺乏失效机制快取将永久有效,若DNS 记录修改,必须重新启动程序才会重新解析DNS 取得新IP。在一些实务情境,程式可没法说重启就重启,
针对此有个简单解法是对特定网站指定 ConnectionLeaseTimeout,强迫 .NET 在一段时间后关闭连线,下次重建连线将可重新解析 DNS。

var sp = ServicePointManager.FindServicePoint(new Uri("http://xxx.yyy.zzz"));
sp.ConnectionLeaseTimeout = *; // 10min

结论:

对于httpClient实例不要Disposable(),应该用一个静态变量把它储存起来,供其它地方使用。

HttpClient到底该不该using?的更多相关文章

  1. HttpClient参观记:.net core 2.2 对HttpClient到底做了什么?

    .net core 于 10月17日发布了 ASP.NET Core 2.2.0 -preview3,在这个版本中,我看到了一个很让我惊喜的新特性:HTTP Client Performance Im ...

  2. HttpClient参观记:.net core 2.2 对HttpClient到底做了神马

    .net core 于 10月17日发布了 ASP.NET Core 2.2.0 -preview3,在这个版本中,我看到了一个很让我惊喜的新特性:HTTP Client Performance Im ...

  3. HttpClient相关

    HTTPClient的主页是http://jakarta.apache.org/commons/httpclient/,你可以在这里得到关于HttpClient更加详细的信息 HttpClient入门 ...

  4. HttpClient,DefaultHttpClient使用详解

    HttpClient:是一个接口 首先需要先创建一个DefaultHttpClient的实例 HttpClient httpClient=new DefaultHttpClient(); 发送GET请 ...

  5. httpclient瓶颈

    问题现象: 1.系统异常,应用拒绝访问. 2.web容器线程爆满 问题分析: 1.数据库正常 2.日志信息没有异常 问题思考: 1.应用访问量突破顶峰. 2.应用在某处存在瓶颈 发现问题: 需要了解线 ...

  6. android和httpClient

    一.说起来都是泪 各大组织不同步,可是我想用别人的库. 二.谷歌和阿帕奇的爱恨情仇 初,谷歌安卓新出,库中自带HttpClient 4.0测试预览版.为与安卓保持API同步,HTTPClient不敢大 ...

  7. android 6.0 SDK中删除HttpClient的相关类的解决方法

    一.出现的情况 在eclipse或 android studio开发, 设置android SDK的编译版本为23时,且使用了httpClient相关类的库项目:如android-async-http ...

  8. httpclient详细介绍

    1.HttpClient简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 ...

  9. 转-Android联网 — HttpURLConnection和HttpClient选择哪个好?

    http://www.ituring.com.cn/article/199619?utm_source=tuicool 在Android开发中,访问网络我们是选择HttpURLConnection还是 ...

随机推荐

  1. pymysql之有序字典

    #!/usr/bin/env python #-*-coding:utf-8-*- import pymysql import json import collections conn = pymys ...

  2. spring boot jsp里面的静态资源访问不到解决办法

    闲着没事写的小Demo 用到了jsp页面,里面有些静态资源, springboot 默认的静态资源的值有四个:Default: classpath:/META-INF/resources/,class ...

  3. devops 下测试组织管理面临的挑战及应对

    导读 先从引发的5个问题讲起,再简单回顾一下devops 简介和兴起背景 ,再从itest 测试管理团队的视角提出应对办法 DevOps后,测试面临的挑战        敏捷开发必然是迭代开发管理模式 ...

  4. linux(05) 编译安装py3

    一.编译安装python3 https://www.cnblogs.com/pyyu/p/9015317.html 1.下载python3的源码 cd /opt yum install wget -y ...

  5. Flask框架之功能详解

    1|0浏览目录 配置文件 路由系统 视图 请求相关 响应 模板渲染 session 闪现 中间件 蓝图(blueprint) 特殊装饰器 1|1配置文件 知识点 给你一个路径 "settin ...

  6. 201871010125 王玉江《面向对象程序设计(java)》第十三周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  7. 微信小程序,知识点

    对于小程序的授权,只要用户授权一次,该授权关系就会记录在后台,除非删除小程序,或者用户在设置中关闭该授权. 官方文档: https://developers.weixin.qq.com/minipro ...

  8. pom.xml文件说明(八)

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  9. django之分页器、多对多关系、form校验组件

    批量插入数据 bulk_create # 1.往书籍表中插入数据 1000 # for i in range(1000): # 这种插入方式 效率极低 # models.Book.objects.cr ...

  10. Django2.2 Vue 前后端分离 无法访问Cookie

    个人验证后可用配置如下: 环境: - Django 2.2 - djangorestframework 3.9 - django-cors-headers 2.5.3 INSTALLED_APPS = ...