.NET 5强化多项网络功能,并开始提供HTTP/3实验性支持

.NET 5在去年的时候正式发布,而直到现在微软才详细地披露,他们对.NET 5网络堆栈所做的功能强化,获得改善的网络功能范畴,包括HTTP、Sockets、网络相关安全性以及部分网络原语。

在.NET 5中,HTTP开始拥有更好的错误处理能力,微软提到,他们对HTTP领域进行了多项改进和修复,像是其中一个常被要求的功能,是在使用HttpClient的时候,希望能从取消的情况中区分超过时。

微软所做的改进包括让开发者可以使用自定义CancellationToken,来区分超过时和取消,为了向后兼容,客户端仍会丢出TaskCanceledException消息,但是内部的异常情况则是TimeoutException。另一个改进是在HttpRequestException中加入HTTP状态代码(HttpStatusCode),新的状态代码属性可为空值,并在EnsureSuccessStatusCode被调用的时候进行设置,可以用在异常过滤器中。

.NET 5的特色之一,便是提供一致的开发体验,而这个想法也在网络相关的实例中贯彻,过去.NET Core中的HTTP堆栈,相依于平台的处理程序(Handlers),像是WinHttpHandler以Windows的WinHTTP为基础,而适用于Linux和Mac的CurlHandler,则是以libcurl为基础,微软提到,由于这两个函数库的差异,因此不可能对每个平台维持一致性。

所以微软开始在.NET Core 2.1中,加入了一个称为SocketsHttpHandler的HTTP实例,并且花费大量心力强化其功能与可靠性,并且从System.Net.Http.dll中,完全删除相依于特定平台的处理程序。在.NET 5中,微软持续强化这样的想法,拿掉让开发者自由切换回旧方法的选项,不过开发者仍然可以通过下载独立的NuGet组件,继续使用WinHttpHandler。

微软提到,因为HttpClient是高端API,使用起来很方便,但是相对的,也就缺少一些灵活性。考量高端场景可能需要更灵活地使用方式,微软在.NET 5中,对SocketsHttpHandler加入了两个扩展功能点ConnectCallback和PlaintextStreamFilter,以强化其灵活性。

ConnectCallback让开发者可以创建自定义连接,当每次打开新的TCP连接时,都会调用ConnectCallback函数,该回呼函数能够被用来创建程序内传输、控制DNS解析,甚至是控制通用或是特定平台的底层Socket选项。而另一个回呼函数PlaintextStreamFilter,则让开发者可以在新打开的连线上,插入自定义层,应用程序在完全创建连接之后,但在发送任何HTTP之前,会先触发此回呼函数,开发者可以将其用于监听安全连接中,发送的明文资料等应用。

由于HTTP/3和其底层传输层QUIC,还在最后标准化阶段,.NET 5使用开源QUIC协议跨平台实例MsQuic,加入了对HTTP/3的实验性支持,官方仍不建议将其用在正式产品中。QUIC是一种基于UDP的传输标准,比创建在TCP之上的连接,拥有更快的握手速度,还对单一连接中的多请求,提供更稳定的多路复用能力,也能对行动客户端,在多重网络环境中,提供更平顺的切换体验。

而.NET 5也弥补了.NET Core在遥测方面的弱点,过去要监控.NET Core应用程序并不方便,用户只会收到冗长且不一致的日志消息,而且监听这些消息,还可能会对性能产生影响。 .NET 5以EventSource为基础,设计并且实例了一系列新的遥测事件和计数器,仅占用少量CPU资源,就可让用户良好地监控.NET 5应用程序。

.NET的安全层,依赖底层操作系统的功能,在以Linux为基础的系统,微软使用OpenSSL来支持TLS 1.3,而在Windows 10,TLS 1.3仅在1903版本后才可用,而且仅提供用作测试目的,因此过去的.NET Core版本,在Windows中并无法使用TLS 1.3,不过这个情况从Windows预览版20170之后情况改变,TLS 1.3默认激活,开发者可以通过新的Schannel API使用TLS 1.3。