【編者按】本文作者是 Windows networking 團(tuán)隊(duì)項(xiàng)目經(jīng)理 Sidharth Nabar。在微軟 Build 2015 大會上,.NET Core 5 作為開發(fā) UWP(Universal Windows Platform)應(yīng)用的最新 .NET 版本正式發(fā)布,本文系 OneAPM 工程師編譯整理。
.NET Core 5 中的一系列網(wǎng)絡(luò) API 是由 Win 8.1 版 Windows Store 應(yīng)用開發(fā)者使用的 API 演進(jìn)而來的(點(diǎn)此查看 MSDN API參考指南)。正如會上所強(qiáng)調(diào)的,將 App 移植到 .NET Core 和 UWP 上,意味著開發(fā)者可以使用相同的代碼庫在 Xbox、 Windows Phone、Windows 和 HoloLens 等平臺實(shí)現(xiàn)同一應(yīng)用。當(dāng)然,你仍可以使用 Windows 8.1 應(yīng)用商店中的全部 .NET 網(wǎng)絡(luò) API(外部 API 不存在被刪除或棄用的狀況)。
如果比較 .NET Framework 與 .NET Core,我們會發(fā)現(xiàn):盡管 .NET Core 中的大部分外部 API 與之前 .NET Framework 版的相同,但這些 API 的底層實(shí)現(xiàn)已經(jīng)發(fā)生了顯著變化,我們也通過此次版本迭代實(shí)現(xiàn)了網(wǎng)絡(luò) API 部署的現(xiàn)代化 ,使之更適用于 Windows 應(yīng)用商店中的 App。在本文中,我們會列舉 UWP 開發(fā)人員可用的全部 .NET 網(wǎng)絡(luò) API,并介紹其實(shí)現(xiàn)原理。
請注意:本文所討論的 API 及其變化僅適用于開發(fā) UWP App 的 .NET Core,并不適用于 .NET Framework 4.6 版本。我們同樣致力于優(yōu)化 .NET Core 網(wǎng)絡(luò) API 以更好地支持服務(wù)器平臺(如 ASP .NET 5),這些內(nèi)容將在另一篇博客中單獨(dú)介紹。同樣,本文也不會介紹 Windows 應(yīng)用開發(fā)者不可用的 .NET 網(wǎng)絡(luò) API。
新的內(nèi)容
以下為 .NET Core 5中為 UWP 應(yīng)用開發(fā)者新加的 API 與功能。
System.Net.Sockets
在 Windows 10 和 .NET Core 5 中,System.Net.Sockets
被添加到用于 UWP 應(yīng)用開發(fā)的 API Surface 中。這是 Windows Store 應(yīng)用期待已久的API( Windows Phone Silverlight 應(yīng)用程序早已使用了此接口),它包含了System.Net.Sockets.Socket
和System.Net.Sockets.SocketAsyncEventArgs
之類的變量,可用于異步套接字通信開發(fā)。在 .NET Core 中,System.Net.Sockets
現(xiàn)有的 API Surface 基于 Phone 8.1 Silverlight 中的 API,并繼續(xù)支持大多數(shù)的類型、屬性和方法(刪除了一些被認(rèn)為已經(jīng)過時(shí)APIs)。展望未來,我們計(jì)劃擴(kuò)大 API Surface 以支持該命名空間下的更多類型--請參考下面的展望部分。
System.Net.Sockets
API 的實(shí)現(xiàn)方式已經(jīng)顯著改變,以便消除對不屬于 .NET Core 的 API 的依賴,同時(shí)使用與 WinRT API 一樣的底層線程 API。我們的目標(biāo)是確保舊版的部署與新版 .NET Core 間的功能對等。如果你在移植 Sockets 代碼到 UWP 時(shí)出現(xiàn)任何步驟或者性能上的差異,請?jiān)?a target="_blank" rel="nofollow">GitHub及時(shí)向我們反饋。
System.Net.Http 得到 HTTP/2 支持
開發(fā)者在Windows 10或.NET Core 5上編寫 UWP 應(yīng)用時(shí),在使用System.Net.Http.HttpClient
時(shí)可獲取 HTTP/2 協(xié)議支持。HTTP/2 是 HTTP 協(xié)議的最新版本,通過最小化連接和往返信息的數(shù)量提供了低延遲的網(wǎng)絡(luò)訪問方式。在 HttpClient
API 中使用該協(xié)議意味著服務(wù)器響應(yīng)更快,應(yīng)用程序在相同的網(wǎng)速下運(yùn)行更加流暢。最棒的是——該功能默認(rèn)生效的,無需對代碼做任何改動即可使用之。了解 HTTP/2 實(shí)現(xiàn) App 更快網(wǎng)絡(luò)訪問的細(xì)節(jié),請參考 Build 2015 會上的演講。該演講還演示了一個(gè)圖片下載的簡單應(yīng)用,在切換到 HTTP/2 后達(dá)到200%的延遲提升(demo視頻)。
下面一段代碼顯示了如何查詢客戶端的 HTTP 版本偏好以及實(shí)際用于連接的 HTTP 版本:
var myClient = new HttpClient();
var myRequest = new HttpRequestMessage(HttpMethod.Get, "http://www.contoso.com");
// This property represents the client preference for the HTTP protocol version.
// The default value for UWP apps is 2.0.
Debug.WriteLine(myRequest.Version.ToString());
var response = await myClient.SendAsync(myRequest);
// This tells if you if the client-server communication is actually using HTTP/2
Debug.WriteLine(response.Version.ToString());
注釋:
其他 .NET 平臺并不支持將
Request.Version
屬性值設(shè)置為2.0,當(dāng)該請求發(fā)出時(shí)會拋出System.ArgumentException
異常。除 UWP 外的其他 .NET 平臺默認(rèn)版本為1.1。Request.Version
屬性表示客戶端 API 優(yōu)先使用 HTTP/2 協(xié)議。實(shí)際使用的HTTP 版本取決于客戶端操作系統(tǒng)、服務(wù)器和中間代理。HTTP/2 是一個(gè)協(xié)商協(xié)議,如果服務(wù)器或者中間代理不支持該協(xié)議,將會回退為 HTTP 1.1 版本。
改動的內(nèi)容
在這一節(jié)中,我們將回顧 Windows Store開發(fā)人員之前使用過的 API,在新版中起底層實(shí)現(xiàn)已經(jīng)發(fā)生了顯著變化。理解這些變化將會幫助你以一個(gè)開發(fā)者的視角,洞悉應(yīng)用程序從 Windows 8.1 Store App 移植到 Windows 10 UWP 的過程中發(fā)生的代碼改動。
System.Net.Http
在 Windows 8.1 中, HttpClient
的實(shí)現(xiàn)基于 HTTP 協(xié)議棧,其包括的類型有System.Net.HttpWebRequest
和System.Net.ServicePointManager
等。在 .NET Core 中,該部分由全新的、輕量級包裝類替代,后者基于原生 Windows OS HTTP 組件,例如基于 WinINet的Windows.Web.Http
。因此,我們能夠利用操作系統(tǒng)的最新功能(例如:HTTP/2),同時(shí)以更快的速度將這些新功能提供給 .NET 開發(fā)人員。此外,運(yùn)行在 Windows 10 上的 .NET 應(yīng)用在內(nèi)存消耗更低,用戶在運(yùn)行多個(gè)應(yīng)用時(shí)也能獲得更為流暢的體驗(yàn)。此文檔所記錄的 System.Net.Http 中的可用 API 集保持不變。
新的實(shí)現(xiàn)方案已經(jīng)通過測試以確保與之前 Windows 8.1 的實(shí)現(xiàn)功能對等,所以開發(fā)人員在將 HTTP 客戶端代碼移植到 UWP 時(shí),API 行為不會有任何差異。然而,如果你發(fā)現(xiàn)任何問題或者 Bug 時(shí),請?jiān)?a target="_blank" rel="nofollow">GitHub上提交給我們。
System.Net.Requests
System.Net.Requests
庫包括 與System.Net.HttpWebRequest
、 System.Net.HttpWebResponse
類相關(guān)的類型,開發(fā)人員可以利用這些類型實(shí)現(xiàn) HTTP協(xié)議的客戶端功能。.NET Core 5 的 API Surface 與適用于 Windows 8.1 應(yīng)用的 API 一致,這些接口相比于 .NET Framework 的外部接口限制更多。這是有意設(shè)置的,我們強(qiáng)烈建議大家使用 HttpClient API--這是我們將會集中精力,創(chuàng)新前進(jìn)的方向。 .NET Core 5 的其他部分,諸如 Windows Communication Foundation (WCF)也已經(jīng)遷移到 .NET Cores 實(shí)現(xiàn)的 HttpClient,點(diǎn)擊此處查看概述。
提供該庫的目的是保證向后兼容性,讓使用舊 API 的 .NET 庫也能使用。對 .NET Core來說,HttpWebRequest
的部署實(shí)際上基于HttpClient
(與 .NET Framework中的依賴順序相反)。正如前文所述,這樣做是為了避免在 UWP 應(yīng)用開發(fā)語境中使用受管理的 .NET HTTP 堆棧,同時(shí)將HttpClient
轉(zhuǎn)變單個(gè) HTTP 客戶端的 API。
不變的內(nèi)容
Windows 8.1 Store 應(yīng)用支持的 System.Net
和System.Net.NetworkInformation
命名空間中的其他類型在 UWP 應(yīng)用依舊可用。這些 API Surface 有少量添加項(xiàng),但其實(shí)現(xiàn)方式并沒有大的變化。
展望未來
本文,我們討論了為 Windows 10 UWP 應(yīng)用開發(fā)人員提供的首版 .NET 網(wǎng)絡(luò) API。我們將繼續(xù)完善這些接口、加入新的外部API,以確保開發(fā)人員能夠使用 .NET 編寫豐富、功能齊全的 UWP 應(yīng)用程序。
為了確保我們優(yōu)先開發(fā)的重點(diǎn) API 是大眾所需的,請讓我們知道你的反饋--請及時(shí)告訴我們 .NET Core 中遺漏的 API,以及在使用 UWP 應(yīng)用時(shí)影響你體驗(yàn)的因素。請?jiān)?a target="_blank" rel="nofollow">GitHub上創(chuàng)建或投票表決Windows platform missing APIs uservoice ,也可以留下您的問題。我們期待與您合作來開發(fā)兼容性更好的優(yōu)質(zhì)應(yīng)用。
原文鏈接:http://blogs.msdn.com/b/dotnet/archive/2015/07/28/net-networking-apis-for-uwp-apps.aspx
OneAPM 助您輕松鎖定 .NET 應(yīng)用性能瓶頸,通過強(qiáng)大的 Trace 記錄逐層分析,直至鎖定行級問題代碼。以用戶角度展示系統(tǒng)響應(yīng)速度,以地域和瀏覽器維度統(tǒng)計(jì)用戶使用情況。想閱讀更多技術(shù)文章,請?jiān)L問 OneAPM 官方博客。