為 UWP 應(yīng)用提供的 .NET 網(wǎng)絡(luò) API

【編者按】本文作者是 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.SocketSystem.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ò)訪問方式。在 HttpClientAPI 中使用該協(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());

注釋:

  1. 其他 .NET 平臺并不支持將Request.Version屬性值設(shè)置為2.0,當(dāng)該請求發(fā)出時(shí)會拋出System.ArgumentException異常。除 UWP 外的其他 .NET 平臺默認(rèn)版本為1.1。

  2. 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.HttpWebRequestSystem.Net.ServicePointManager等。在 .NET Core 中,該部分由全新的、輕量級包裝類替代,后者基于原生 Windows OS HTTP 組件,例如基于 WinINetWindows.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.HttpWebRequestSystem.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.NetSystem.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 官方博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,668評論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內(nèi)容