ASP.NET Core HttpClient的实现原理系列四
内容提要
HttpClient是.NET Framework中的组件,用于进行HTTP请求和与Web服务通信。在.NET Core中,HttpClient有两个处理器:BrowserHttpHandler和SocketsHttpHandler。BrowserHttpHandler用于浏览器环境,SocketsHttpHandler用于高级HTTP网络类的实现。在.NET Framework和Mono中,默认使用HttpWebRequest发送请求。HttpClient是一个高层级API,封装了底层功能。从.NET Framework到.NET Core再到现在.NET,API层的感知并不大,但运行时进行了改进和优化。
延伸解读
处理器选择:平台差异与默认行为
HttpClient 的默认处理器因平台而异。在 .NET Core 中,HttpClientHandler 会根据平台选择 BrowserHttpHandler 或 SocketsHttpHandler;从 .NET Core 2.1 起,SocketsHttpHandler 成为默认消息处理器。而在 .NET Framework 和 Mono 中,默认使用 HttpWebRequest 发送请求。开发者可通过构造函数传入 HttpMessageHandler 参数来指定其他处理器,这为跨平台行为调整提供了入口。
SocketsHttpHandler 带来的性能与部署改进
SocketsHttpHandler 提供了更高级别的 HTTP 网络类实现,与先前实现相比性能显著提升,并消除了平台依赖性。例如在 macOS 和 Linux 上,.NET Core 不再依赖 libcurl,这简化了部署和维护。该处理器是 HttpClientHandler 的底层封装,创建 HttpClient 时默认使用它,体现了 .NET Core 对 HTTP 栈的重构。
API 稳定背后的运行时优化
从 .NET Framework 到 .NET Core 再到现在的 .NET,用户 API 层的感知并不大,但运行时进行了大量改进和优化。HttpClient 作为高层级 API,封装了各平台可用的较低级别功能。这种设计让开发者无需大幅修改代码即可受益于底层性能提升,也是 .NET 目前性能得到重大改进的原因之一。
Q&A
HttpClient在.NET Core中默认使用哪个消息处理器?
从.NET Core 2.1开始,HttpClient默认使用SocketsHttpHandler作为消息处理器。
SocketsHttpHandler有什么优点?
SocketsHttpHandler提供了用于更高级别HTTP网络类(如HttpClient)的实现,与先前实现相比性能显著提升,消除了平台依赖性,简化了部署和维护。例如,在macOS和Linux上,对于.NET Core,不再依赖于libcurl。
BrowserHttpHandler用在什么场景?
BrowserHttpHandler用于浏览器环境,通常在基于浏览器的.NET平台(例如Blazor WebAssembly)中使用。
在.NET Framework和Mono中,HttpClient默认使用什么发送请求?
在.NET Framework和Mono中,默认使用HttpWebRequest来发送请求。可以通过在构造函数的重载中使用HttpMessageHandler参数指定不同的处理程序来修改此行为。
HttpClientHandler和SocketsHttpHandler有什么关系?
HttpClientHandler本质上是对SocketsHttpHandler的封装。创建HttpClient时默认使用HttpClientHandler,而它内部会根据平台选择BrowserHttpHandler或SocketsHttpHandler。
从.NET Framework到.NET Core,HttpClient的API有什么变化?
从.NET Framework到.NET Core再到现在.NET,用户API层的感知并不大,但运行时进行了很多改进和优化,提升了性能。