.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。


Advertisement

更多 iThome相關內容