【編者按】本文作者是 Windows networking 團隊項目經(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 演進而來的(點此查看 MSDN API參考指南)谜诫。正如會上所強調(diào)的,將 App 移植到 .NET Core 和 UWP 上攻旦,意味著開發(fā)者可以使用相同的代碼庫在 Xbox喻旷、 Windows Phone、Windows 和 HoloLens 等平臺實現(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 的底層實現(xiàn)已經(jīng)發(fā)生了顯著變化遍尺,我們也通過此次版本迭代實現(xiàn)了網(wǎng)絡(luò) API 部署的現(xiàn)代化 ,使之更適用于 Windows 應(yīng)用商店中的 App涮拗。在本文中乾戏,我們會列舉 UWP 開發(fā)人員可用的全部 .NET 網(wǎng)絡(luò) API,并介紹其實現(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)容將在另一篇博客中單獨介紹惯退。同樣,本文也不會介紹 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ù)的類型妒貌、屬性和方法(刪除了一些被認為已經(jīng)過時APIs)通危。展望未來,我們計劃擴大 API Surface 以支持該命名空間下的更多類型--請參考下面的展望部分灌曙。
System.Net.Sockets
API 的實現(xiàn)方式已經(jīng)顯著改變菊碟,以便消除對不屬于 .NET Core 的 API 的依賴,同時使用與 WinRT API 一樣的底層線程 API在刺。我們的目標是確保舊版的部署與新版 .NET Core 間的功能對等逆害。如果你在移植 Sockets 代碼到 UWP 時出現(xiàn)任何步驟或者性能上的差異,請在GitHub及時向我們反饋蚣驼。
System.Net.Http 得到 HTTP/2 支持
開發(fā)者在Windows 10或.NET Core 5上編寫 UWP 應(yīng)用時魄幕,在使用System.Net.Http.HttpClient
時可獲取 HTTP/2 協(xié)議支持。HTTP/2 是 HTTP 協(xié)議的最新版本颖杏,通過最小化連接和往返信息的數(shù)量提供了低延遲的網(wǎng)絡(luò)訪問方式纯陨。在 HttpClient
API 中使用該協(xié)議意味著服務(wù)器響應(yīng)更快,應(yīng)用程序在相同的網(wǎng)速下運行更加流暢。最棒的是——該功能默認生效的队丝,無需對代碼做任何改動即可使用之靡馁。了解 HTTP/2 實現(xiàn) App 更快網(wǎng)絡(luò)訪問的細節(jié),請參考 Build 2015 會上的演講机久。該演講還演示了一個圖片下載的簡單應(yīng)用臭墨,在切換到 HTTP/2 后達到200%的延遲提升(demo視頻)。
下面一段代碼顯示了如何查詢客戶端的 HTTP 版本偏好以及實際用于連接的 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ā)出時會拋出System.ArgumentException
異常胧弛。除 UWP 外的其他 .NET 平臺默認版本為1.1。Request.Version
屬性表示客戶端 API 優(yōu)先使用 HTTP/2 協(xié)議侠畔。實際使用的HTTP 版本取決于客戶端操作系統(tǒng)结缚、服務(wù)器和中間代理。HTTP/2 是一個協(xié)商協(xié)議软棺,如果服務(wù)器或者中間代理不支持該協(xié)議红竭,將會回退為 HTTP 1.1 版本。
改動的內(nèi)容
在這一節(jié)中喘落,我們將回顧 Windows Store開發(fā)人員之前使用過的 API茵宪,在新版中起底層實現(xiàn)已經(jīng)發(fā)生了顯著變化。理解這些變化將會幫助你以一個開發(fā)者的視角瘦棋,洞悉應(yīng)用程序從 Windows 8.1 Store App 移植到 Windows 10 UWP 的過程中發(fā)生的代碼改動稀火。
System.Net.Http
在 Windows 8.1 中, HttpClient
的實現(xiàn)基于 HTTP 協(xié)議棧赌朋,其包括的類型有System.Net.HttpWebRequest
和System.Net.ServicePointManager
等凰狞。在 .NET Core 中,該部分由全新的沛慢、輕量級包裝類替代赡若,后者基于原生 Windows OS HTTP 組件,例如基于 WinINet的Windows.Web.Http
团甲。因此斩熊,我們能夠利用操作系統(tǒng)的最新功能(例如:HTTP/2),同時以更快的速度將這些新功能提供給 .NET 開發(fā)人員伐庭。此外,運行在 Windows 10 上的 .NET 應(yīng)用在內(nèi)存消耗更低分冈,用戶在運行多個應(yīng)用時也能獲得更為流暢的體驗圾另。此文檔所記錄的 System.Net.Http 中的可用 API 集保持不變。
新的實現(xiàn)方案已經(jīng)通過測試以確保與之前 Windows 8.1 的實現(xiàn)功能對等雕沉,所以開發(fā)人員在將 HTTP 客戶端代碼移植到 UWP 時集乔,API 行為不會有任何差異。然而,如果你發(fā)現(xiàn)任何問題或者 Bug 時扰路,請在GitHub上提交給我們尤溜。
System.Net.Requests
System.Net.Requests
庫包括 與System.Net.HttpWebRequest
、 System.Net.HttpWebResponse
類相關(guān)的類型汗唱,開發(fā)人員可以利用這些類型實現(xiàn) HTTP協(xié)議的客戶端功能宫莱。.NET Core 5 的 API Surface 與適用于 Windows 8.1 應(yīng)用的 API 一致,這些接口相比于 .NET Framework 的外部接口限制更多哩罪。這是有意設(shè)置的授霸,我們強烈建議大家使用 HttpClient API--這是我們將會集中精力,創(chuàng)新前進的方向际插。 .NET Core 5 的其他部分碘耳,諸如 Windows Communication Foundation (WCF)也已經(jīng)遷移到 .NET Cores 實現(xiàn)的 HttpClient,點擊此處查看概述框弛。
提供該庫的目的是保證向后兼容性辛辨,讓使用舊 API 的 .NET 庫也能使用。對 .NET Core來說瑟枫,HttpWebRequest
的部署實際上基于HttpClient
(與 .NET Framework中的依賴順序相反)斗搞。正如前文所述,這樣做是為了避免在 UWP 應(yīng)用開發(fā)語境中使用受管理的 .NET HTTP 堆棧力奋,同時將HttpClient
轉(zhuǎn)變單個 HTTP 客戶端的 API榜旦。
不變的內(nèi)容
Windows 8.1 Store 應(yīng)用支持的 System.Net
和System.Net.NetworkInformation
命名空間中的其他類型在 UWP 應(yīng)用依舊可用。這些 API Surface 有少量添加項景殷,但其實現(xiàn)方式并沒有大的變化溅呢。
展望未來
本文,我們討論了為 Windows 10 UWP 應(yīng)用開發(fā)人員提供的首版 .NET 網(wǎng)絡(luò) API猿挚。我們將繼續(xù)完善這些接口咐旧、加入新的外部API,以確保開發(fā)人員能夠使用 .NET 編寫豐富绩蜻、功能齊全的 UWP 應(yīng)用程序铣墨。
為了確保我們優(yōu)先開發(fā)的重點 API 是大眾所需的,請讓我們知道你的反饋--請及時告訴我們 .NET Core 中遺漏的 API办绝,以及在使用 UWP 應(yīng)用時影響你體驗的因素伊约。請在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)用性能瓶頸,通過強大的 Trace 記錄逐層分析降淮,直至鎖定行級問題代碼超埋。以用戶角度展示系統(tǒng)響應(yīng)速度,以地域和瀏覽器維度統(tǒng)計用戶使用情況。想閱讀更多技術(shù)文章霍殴,請訪問 OneAPM 官方博客媒惕。