dotnet 6 HttpClientHandler 和 SocketsHttpHandler 有什么差别
本文来告诉大家在 dotnet 6 的 HttpClientHandler 和 SocketsHttpHandler 两个类型有什么不同
在创建 HttpClient 时,可以在 HttpClient 的构造函数传入 HttpMessageHandler 类型的参数,此参数将执行实际的逻辑。其中常用的传入参数类型就是 HttpClientHandler 和 SocketsHttpHandler 类型
那这两个类型有什么差别呢?根据官方文档 可以了解到,从 .NET Core 2.1 开始,默认的 HttpClient 底层的网络通讯实现就是靠 System.Net.Http.SocketsHttpHandler 实现的,替代了原先的 HttpClientHandler 类型
也就是说在 dotnet 6 采用的 HttpClient 底层使用的是 SocketsHttpHandler 类型作为默认的网络通讯。那原有的使用 HttpClientHandler 的代码呢?其实在底层也做了统一,使用 HttpClientHandler 也将在底层采用 SocketsHttpHandler 作为网络通讯
请看 dotnet 6 的 HttpClientHandler 的源代码
using HttpHandlerType = System.Net.Http.SocketsHttpHandler;
public partial class HttpClientHandler : HttpMessageHandler
{
private readonly HttpHandlerType _underlyingHandler;
private HttpMessageHandler Handler
=> _underlyingHandler;
public HttpClientHandler()
{
_underlyingHandler = new HttpHandlerType();
ClientCertificateOptions = ClientCertificateOption.Manual;
}
protected internal override HttpResponseMessage Send(HttpRequestMessage request, CancellationToken cancellationToken) =>
Handler.Send(request, cancellationToken);
protected internal override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) =>
Handler.SendAsync(request, cancellationToken);
// 忽略其他逻辑
}
可以看到在 HttpClientHandler 的底层实现就是使用 SocketsHttpHandler 来实现的
也就是说,无论你在 HttpClient 传入的参数类型是 SocketsHttpHandler 还是 HttpClientHandler 类型,在 dotnet 6 都会实际上调用到 SocketsHttpHandler 类型。还请不需要纠结这部分的差异
任何对 HttpClientHandler 的配置都会被设置到底层的 SocketsHttpHandler 类型的 Handler 属性
唯一需要开始纠结差异的部分只是在于 SocketsHttpHandler 提供了更多的控制性,如连接超时时间,以及更新 DNS 解析时间和更多的 SSL 控制。由于 HttpClientHandler 是 .NET Framework 4.5 时就提供的类型,比 .NET Core 2.1 提供的 SocketsHttpHandler 类型可使用的 API 数量要少。如果你需要对网络有更多的控制,那还请采用 SocketsHttpHandler 类型
var socketsHttpHandler = new SocketsHttpHandler()
{
// 这个可以设置连接的超时时间
ConnectTimeout = TimeSpan.FromSeconds(10),
//PooledConnectionIdleTimeout = TimeSpan.FromSeconds(100),
// HttpClient only resolves DNS entries when a connection is created. It does not track any time to live (TTL) durations specified by the DNS server. If DNS entries change regularly, which can happen in some container scenarios, the client won't respect those updates. To solve this issue, you can limit the lifetime of the connection by setting the SocketsHttpHandler.PooledConnectionLifetime property, so that DNS lookup is required when the connection is replaced.
PooledConnectionLifetime = TimeSpan.FromSeconds(1000),
SslOptions = new SslClientAuthenticationOptions()
{
RemoteCertificateValidationCallback = (sender, certificate, chain, errors) => true, // HttpClientHandler.DangerousAcceptAnyServerCertificateValidator 忽略证书错误
},
};
var httpClient = new HttpClient(socketsHttpHandler);
采用 SocketsHttpHandler 能够做到更多的平台独立,从而让网络行为在各个平台统一
dotnet 6 HttpClientHandler 和 SocketsHttpHandler 有什么差别的更多相关文章
- .Netcore HttpClient源码探究
源码搜索与概述 搜索HttpClient源码 https://source.dot.net/#System.Net.Http/System/Net/Http/HttpClient.cs 1.HttpC ...
- C# HttpClient使用和注意事项,.NET Framework连接池并发限制
System.Net.Http.HttpClient 类用于发送 HTTP 请求以及从 URI 所标识的资源接收 HTTP 响应. HttpClient 实例是应用于该实例执行的所有请求的设置集合,每 ...
- .NET 2.0 参考源码索引
http://www.projky.com/dotnet/2.0/Microsoft/CSharp/csharpcodeprovider.cs.htmlhttp://www.projky.com/do ...
- dotnet 6 在 Win7 系统证书链错误导致 HttpWebRequest 内存泄露
本文记录我将应用迁移到 dotnet 6 之后,在 Win7 系统上,因为使用 HttpWebRequest 访问一个本地服务,此本地服务开启 https 且证书链在此 Win7 系统上错误,导致应用 ...
- DotNet命名规范参考(转)
来自:http://www.cnblogs.com/w-y-f/archive/2012/05/30/2526254.html DotNet命名规范参考 一.命名规范 注意事项:使用英文命名规则,尽量 ...
- DotNet基础
DotNet基础 URL特殊字符转义 摘要: URL中一些字符的特殊含义,基本编码规则如下: 1.空格换成加号(+) 2.正斜杠(/)分隔目录和子目录 3.问号(?)分隔URL和查询 4.百分号(%) ...
- asp.net Core HttpClient 出现Cannot access a disposed object. Object name: 'SocketsHttpHandler' 的问题。
ASP.NET Core 部署在Centos 中 偶尔出现 One or more errors occurred. (Cannot access a disposed object.Object n ...
- 常见dotNet加密保护工具分析介绍(转)
本文主要介绍一些dotNet加密保护工具的原理以及就其脱壳进行简单探讨.remotesoft protector.maxtocode..Net Reactor.Cliprotector .themi ...
- DotNet 使用阿里云媒体转码服务
公司项目中一部分文件放到了阿里云 OSS 上,其中有些音频文件是 amr 类型的,在后期使用的时候比较麻烦,所以需要转换成 mp3 的文件,方便以后使用.本来想使用 ffmpeg 处理,但由于文件都存 ...
- dotnet 使用 MessagePack 序列化对象
和很多序列化库一样,可以通过 MessagePack 序列化和反序列化,和 json 相比这个库提供了二进制的序列化,序列化之后的内容长度比 json 小很多 这个库能序列的内容不多,大多数时候建议使 ...
随机推荐
- 【Leetcode】64. 最小路径和
题目(链接) 给定一个包含非负整数的m x n网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例 1: 输入:grid = [[1 ...
- RSA算法揭秘:加密世界的守护者
RSA算法起源: RSA算法是由Ron Rivest.Adi Shamir和Leonard Adleman在1977年共同提出的.它是一种非对称加密算法,基于两个大素数的乘积难以分解的数论问题.RSA ...
- 记一起rust悬垂引用解决
最初要写一段从redis的hash获取json字符串,转化为结构体,代码逻辑如下 use redis::{Client, Commands, Connection, Iter}; use serde: ...
- python 图片转文字小工具
应群友要求,要做一个图片转文字的格式,因为有些人的简历中只有一张图片要提取他里面的文字就不好办了. 于是就有了下面这个小工具: 功能:选择要识别的图片后,识别出来后存到.txt文本中. 实现原理,基于 ...
- Spring Boot 工程开发常见问题解决方案,日常开发全覆盖
本文是 SpringBoot 开发的干货集中营,涵盖了日常开发中遇到的诸多问题,通篇着重讲解如何快速解决问题,部分重点问题会讲解原理,以及为什么要这样做.便于大家快速处理实践中经常遇到的小问题,既方便 ...
- 电影数据集【可供机器学习附爬虫源码】(豆瓣、爱奇艺、IMDB、腾讯视频等)
电影数据集(豆瓣.爱奇艺.IMDB.腾讯视频.搜狐.1905) 爬虫爬取豆瓣.爱奇艺.IMDB.腾讯视频.搜狐.1905网,电影数据. 获取方式:微信搜索关注[靠谱杨阅读人生]回复[电影]. 整理不易 ...
- #数学期望,高斯消元#洛谷 3232 [HNOI2013]游走
题目 分析 如果计算出边的期望经过次数那就可以算出来答案 首先转换成点的期望经过次数,设\(dp[x]\)表示点\(x\)的期望经过次数 那么\(dp[x]=\sum_{y\in son}\frac{ ...
- Jetty的http3模块
启用http3模块,执行如下命令: java -jar $JETTY_HOME/start.jar --add-modules=http3 命令的输出,如下: ALERT: There are ena ...
- OpenHarmony AI框架开发指导
一.概述 1.功能简介 AI 业务子系统是 OpenHarmony 提供原生的分布式 AI 能力的子系统.AI 业务子系统提供了统一的 AI 引擎框架,实现算法能力快速插件化集成. AI 引擎框架主要 ...
- 开源机密计算平台:蓬莱-OpenHarmony
演讲嘉宾 | 杜 东 回顾整理 | 廖 涛 排版校对 | 李萍萍 嘉宾简介 杜东,上海交通大学助理研究员.中国计算机学会CCF会员,ACM会员.研究兴趣为操作系统与体系结构.服务器无感知(Se ...