架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 27|回复: 1

[资料] .NET/C# 中 HttpClient 使用 Http/2.0 版本协议

[复制链接]
发表于 昨天 21:16 | 显示全部楼层 |阅读模式
需求:现在大多数网站主流使用的是 Http/1.1 和 Http/2.0 版本协议,对于网站只支持 HTTP/2 协议版本的网站,使用 HttpClient 默认发送请求,会抛出 System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.IO.IOException: Unable to read data from the transport connection: 你的主机中的软件中止了一个已建立的连接。. ---> System.Net.Sockets.SocketException (10053): 你的主机中的软件中止了一个已建立的连接。 at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.CreateException(SocketError error, Boolean forAsyncThrow)  的异常。

Http 协议发展史

时间轴

QQ截图20250831205756.jpg

HTTP/0.9

已过时的 HTTP/0.9 是 HTTP 协议的第一个版本,诞生于 1989 年。它的组成极其简单,只允许客户端发送 GET 这一种请求,而且不支持请求头。由于没有协议头,所以 HTTP/0.9 只能支持一种内容——纯文本。服务器只能回应 HTML 格式的字符串,不能回应别的格式。服务器发送完毕后,就会关闭 TCP 连接。
HTTP/0.9 具有典型的无状态性,每个访问都独立处理,处理完成后就会断开连接。如果请求的页面不存在,也不会返回任何错误码。

HTTP/1

HTTP/1 是 HTTP 1.0 和 HTTP 1.1 的统称,分别指 HTTP 协议的版本是 1.0 和 1.1。
HTTP 1.0 是 HTTP 协议的第二个版本,至今仍被广泛采用。它在 HTTP/0.9 的基础上做了大量的扩充和改进,包括:

可以发送更多格式的内容,如图像、视频、二进制文件,不仅仅局限于文本了
在 GET 的基础上,增加了 HEAD 和 POST 请求方法
改变了 HTTP 请求和回应的格式。除了数据部分,每次通信都必须包括头信息(HTTP Header),用来描述一些元数据,即增加了请求头信息
新增了响应状态码(status code)、多字符集支持、权限(authorization)、缓存(cache)、内容编码(content encoding)等功能
虽然还是无状态协议,不过在请求(request)中增加 了“Connection: keep-alive”Header 头后就能支持长连接

HTTP 1.1

HTTP 1.1是标准化的协议,HTTP 1.1消除了大量歧义内容并引入了多项改进。

特点

缓存处理,HTTP 1.1引入了更多的缓存控制策略,例如Entity tag、If-Unmodified-Since、If-Match、If-None-Match等更多可供选择的缓存头来控制缓存策略。
带宽优化以及网络连接的使用,在请求头中引入了range,它允许只请求资源的某一个部分,即返回206状态码,这样方便了开发者自由选择以便充分利用带宽和链接,并且可以使用Range和Content-Range制作断点续传功能。
错误通知的管理,在HTTP 1.1中新增了24个错误状态码。
增加Host请求头,能够使不同域名配置在同一个IP地址的服务器上。
支持长连接,HTTP 1.1支持长连接,在一个TCP连接上可以传输多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP 1.1中默认开启Connection:keep-alive,一般浏览器对于同一个域名允许同时建立6个长链接。
增加管线化技术,允许在第一个应答被完全发送之前就发送第二个请求,以改善队头阻塞问题,但响应的顺序还是会按照请求的顺序返回。
支持响应分块,通过设置Transfer-Encoding: chunked进行分块响应,允许响应的数据可以分成多个部分,配合服务端尽早释放缓冲可以获得更快的响应速度。

HTTP 2.0

HTTP 2.0拥有更优异的表现,现网页愈渐变得的复杂,甚至演变成了独有的应用,媒体的播放量,增进交互的脚本大小也增加了许多,更多的数据通过HTTP请求被传输,由此HTTP 2.0为网络效率做了大量的优化。

特点

二进制分帧,HTTP 2.0是二进制协议而不是文本协议,将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码。
多路复用,并行的请求能在同一个链接中处理,在同一域名下所有访问都是从同一个TCP连接中走,HTTP消息被分解为独立的帧,服务端根据标识符和首部将消息重新组装起来,移除了HTTP 1.1中顺序和阻塞的约束。
压缩header,header在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。
服务端推送,服务器可以主动地向客户端推送资源,而无需客户端明确的请求。

HTTP 3.0

HTTP 3.0目前处于制订和测试阶段,是未来的全新的HTTP协议,HTTP 3.0协议运行在QUIC协议之上,是在UDP的基础上实现了可靠传输,权衡传输速度与传输可靠性并加以优化,使用UDP将避免TCP的队头阻塞问题,并加快网络传输速度,但同样需要实现可靠传输的机制,HTTP 3.0不是HTTP 2.0的拓展,HTTP 3.0将会是一个全新的协议。

HttpClientHandler VS SocketsHttpHandler

.NET Framework 和 .NET Core 2.0 及更低版本中由 HttpClient 使用的默认消息处理程序为HttpClientHandler。

从 .NET Core 2.1 开始,类SocketsHttpHandler提供了更高级别的 HTTP 网络类(例如HttpClient )使用的实现。使用SocketsHttpHandler提供了许多优点:

与之前的实施相比,性能显着提高。
消除平台依赖性,从而简化部署和服务。例如,libcurl不再依赖于 macOS 的 .NET Core 和 Linux 的 .NET Core。
所有 .NET 平台上的行为一致。

.NET 9 中 HttpClientFactory 使用 SocketsHttpHandler 作为主处理程序

HttpClientFactory允许为命名对象和类型化HttpMessageHandler对象配置HttpClient管道。 最内部的处理程序或实际在网络上发送请求的处理程序称为 主处理程序。 如果未配置,则此处理程序以前始终是一个 HttpClientHandler。 虽然默认的主处理程序是实现详细信息,但有用户依赖于它。 例如,某些用户将主处理程序强制转换为 HttpClientHandler 设置属性,例如 ClientCertificates, UseCookies和 UseProxy。

链接:超链接登录可见。

全局配置请求 HTTP 协议版本

代码如下:

DefaultRequestVersion 默认设置为 HttpVersion.Version11

属性DefaultRequestVersion指定要用于使用此HttpClient实例发送的请求的默认 HTTP 版本,当它构造HttpRequestMessage要发送的 时,特别是通过调用 、、、GetStreamAsyncGetAsyncGetByteArrayAsync、PatchAsyncGetStringAsync、 PostAsync和 PutAsync等DeleteAsync方法。

属性 DefaultRequestVersion 不适用于 SendAsync 方法。 HttpRequestMessage作为参数SendAsync传递给 方法的参数具有其自己的Version属性,用于控制用于请求的 HTTP 版本。

链接:超链接登录可见。

HttpVersionPolicy 协商政策

RequestVersionOrLower:使用请求的版本,或降级为更低的版本(但不能高于请求的版本)。这是默认行为。简单来说,最高使用的协议版本为当前版本,如果当前协议版本不支持,则开始降级。
RequestVersionOrHigher:使用服务器支持的最高版本,但不能低于请求的版本。即:允许升级,不允许降级到请求版本以下。简单来说,尽可能的使用高版本协议进行通信。
RequestVersionExact:严格使用请求的版本,不允许升级或降级。

HttpClient 使用 Http/2.0 版本协议

测试代码如下:

请求使用 1.1 版本,最终客户端和服务器协商使用的 2.0 协议进行通信,所以,最终响应是 2.0 版本,如下图:

QQ截图20250831211322.jpg

参考:

超链接登录可见。
超链接登录可见。
超链接登录可见。




上一篇:MinIO 存储(三)将本地文件复制上传(迁移)到 minio 桶
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 昨天 21:46 | 显示全部楼层
请求被中止: 未能创建 SSL/TLS 安全通道解决方案
https://www.itsvse.com/thread-7612-1-1.html
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-9-1 10:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表