HttpClientHandler VS SocketsHttpHandler
内容提要
从.NET Core 2.1开始,使用SocketsHttpHandler替代HttpClientHandler,提高性能,简化部署和服务。如果使用.NET Core 2.1-3.1,可以通过配置文件或环境变量将应用程序配置为使用旧的HttpClientHandler类。从.NET 5开始,这些配置选项不可用。
延伸解读
版本升级带来的行为变化
从 .NET Core 2.1 开始,SocketsHttpHandler 成为 HttpClient 的默认消息处理程序,取代了 HttpClientHandler。这一变化不仅提升了性能,还消除了对平台特定库(如 libcurl)的依赖,使部署更简单,并在所有 .NET 平台上提供一致的行为。对于从旧版本升级的应用程序,需要留意这一底层实现的改变可能带来的细微行为差异。
回退到旧处理程序的配置方式
如果应用程序在 .NET Core 2.1-3.1 上运行,并且由于兼容性问题需要继续使用旧的 HttpClientHandler,可以通过三种方式配置:调用 AppContext.SetSwitch 方法、在 runtimeconfig.json 中设置开关,或定义环境变量 DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER 为 false 或 0。这些选项为迁移提供了灵活性。
注意 .NET 5 及更高版本的配置限制
从 .NET 5 开始,上述用于切换回 HttpClientHandler 的配置选项不再可用。这意味着如果应用程序升级到 .NET 5 或更高版本,将无法通过配置方式使用旧的 HttpClientHandler,必须适应 SocketsHttpHandler 作为默认实现。开发者在规划升级时,应提前测试和解决可能出现的兼容性问题。
Q&A
什么是SocketsHttpHandler,它有什么优势?
SocketsHttpHandler是从.NET Core 2.1开始引入的HTTP网络类实现,提供显著的性能提升,消除平台依赖性,简化部署和服务。
如何在.NET Core 2.1-3.1中使用旧的HttpClientHandler?
可以通过AppContext.SetSwitch方法、在runtimeconfig.json中定义开关,或设置环境变量DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER为false来使用旧的HttpClientHandler。
从.NET 5开始,关于HttpClientHandler的配置有什么变化?
从.NET 5开始,不再支持配置选项以使用旧的HttpClientHandler,所有应用程序默认使用SocketsHttpHandler。
为什么要从HttpClientHandler切换到SocketsHttpHandler?
切换到SocketsHttpHandler可以提高性能,消除平台依赖性,并确保在所有.NET平台上的一致行为。
SocketsHttpHandler如何简化部署和服务?
SocketsHttpHandler消除了对特定平台的依赖,使得在不同操作系统上部署和服务变得更加简单和一致。
在.NET Core 2.1-3.1中,如何通过配置文件使用SocketsHttpHandler?
可以在.netcore.runtimeconfig.json配置文件中定义开关System.Net.Http.UseSocketsHttpHandler为false,以使用SocketsHttpHandler。