爲 UWP 應用提供的 .NET 網絡 API

【編者按】本文做者是 Windows networking 團隊項目經理 Sidharth Nabar。在微軟 Build 2015 大會上,.NET Core 5 做爲開發 UWP(Universal Windows Platform)應用的最新 .NET 版本正式發佈,本文系 OneAPM 工程師編譯整理。html

.NET Core 5 中的一系列網絡 API 是由 Win 8.1 版 Windows Store 應用開發者使用的 API 演進而來的(點此查看 MSDN API參考指南)。正如會上所強調的,將 App 移植到 .NET Core 和 UWP 上,意味着開發者可使用相同的代碼庫在 Xbox、 Windows Phone、Windows 和 HoloLens 等平臺實現同一應用。固然,你仍可使用 Windows 8.1 應用商店中的所有 .NET 網絡 API(外部 API 不存在被刪除或棄用的情況)。git

若是比較 .NET Framework 與 .NET Core,咱們會發現:儘管 .NET Core 中的大部分外部 API 與以前 .NET Framework 版的相同,但這些 API 的底層實現已經發生了顯著變化,咱們也經過這次版本迭代實現了網絡 API 部署的現代化 ,使之更適用於 Windows 應用商店中的 App。在本文中,咱們會列舉 UWP 開發人員可用的所有 .NET 網絡 API,並介紹其實現原理。github

請注意:本文所討論的 API 及其變化僅適用於開發 UWP App 的 .NET Core,並不適用於 .NET Framework 4.6 版本。咱們一樣致力於優化 .NET Core 網絡 API 以更好地支持服務器平臺(如 ASP .NET 5),這些內容將在另外一篇博客中單獨介紹。一樣,本文也不會介紹 Windows 應用開發者不可用的 .NET 網絡 API。windows

新的內容

如下爲 .NET Core 5中爲 UWP 應用開發者新加的 API 與功能。api

System.Net.Sockets

在 Windows 10 和 .NET Core 5 中,System.Net.Sockets 被添加到用於 UWP 應用開發的 API Surface 中。這是 Windows Store 應用期待已久的API( Windows Phone Silverlight 應用程序早已使用了此接口),它包含了System.Net.Sockets.SocketSystem.Net.Sockets.SocketAsyncEventArgs之類的變量,可用於異步套接字通訊開發。在 .NET Core 中,System.Net.Sockets現有的 API Surface 基於 Phone 8.1 Silverlight 中的 API,並繼續支持大多數的類型、屬性和方法(刪除了一些被認爲已通過時APIs)。展望將來,咱們計劃擴大 API Surface 以支持該命名空間下的更多類型--請參考下面的展望部分瀏覽器

System.Net.Sockets API 的實現方式已經顯著改變,以便消除對不屬於 .NET Core 的 API 的依賴,同時使用與 WinRT API 同樣的底層線程 API。咱們的目標是確保舊版的部署與新版 .NET Core 間的功能對等。若是你在移植 Sockets 代碼到 UWP 時出現任何步驟或者性能上的差別,請在GitHub及時向咱們反饋。服務器

System.Net.Http 獲得 HTTP/2 支持

開發者在Windows 10或.NET Core 5上編寫 UWP 應用時,在使用System.Net.Http.HttpClient時可獲取 HTTP/2 協議支持。HTTP/2 是 HTTP 協議的最新版本,經過最小化鏈接和往返信息的數量提供了低延遲的網絡訪問方式。在 HttpClient API 中使用該協議意味着服務器響應更快,應用程序在相同的網速下運行更加流暢。最棒的是——該功能默認生效的,無需對代碼作任何改動便可使用之。瞭解 HTTP/2 實現 App 更快網絡訪問的細節,請參考 Build 2015 會上的演講。該演講還演示了一個圖片下載的簡單應用,在切換到 HTTP/2 後達到200%的延遲提高(demo視頻)網絡

下面一段代碼顯示瞭如何查詢客戶端的 HTTP 版本偏好以及實際用於鏈接的 HTTP 版本:app

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屬性值設置爲2.0,當該請求發出時會拋出System.ArgumentException異常。除 UWP 外的其餘 .NET 平臺默認版本爲1.1。

  2. Request.Version屬性表示客戶端 API 優先使用 HTTP/2 協議。實際使用的HTTP 版本取決於客戶端操做系統、服務器和中間代理。HTTP/2 是一個協商協議,若是服務器或者中間代理不支持該協議,將會回退爲 HTTP 1.1 版本。

改動的內容

在這一節中,咱們將回顧 Windows Store開發人員以前使用過的 API,在新版中起底層實現已經發生了顯著變化。理解這些變化將會幫助你以一個開發者的視角,洞悉應用程序從 Windows 8.1 Store App 移植到 Windows 10 UWP 的過程當中發生的代碼改動。

System.Net.Http

在 Windows 8.1 中, HttpClient的實現基於 HTTP 協議棧,其包括的類型有System.Net.HttpWebRequestSystem.Net.ServicePointManager等。在 .NET Core 中,該部分由全新的、輕量級包裝類替代,後者基於原生 Windows OS HTTP 組件,例如基於 WinINet.aspx)的 Windows.Web.Http。所以,咱們可以利用操做系統的最新功能(例如:HTTP/2),同時以更快的速度將這些新功能提供給 .NET 開發人員。此外,運行在 Windows 10 上的 .NET 應用在內存消耗更低,用戶在運行多個應用時也能得到更爲流暢的體驗。此文檔所記錄的 System.Net.Http 中的可用 API 集保持不變。

新的實現方案已經經過測試以確保與以前 Windows 8.1 的實現功能對等,因此開發人員在將 HTTP 客戶端代碼移植到 UWP 時,API 行爲不會有任何差別。然而,若是你發現任何問題或者 Bug 時,請在GitHub上提交給咱們。

System.Net.Requests

System.Net.Requests庫包括 與System.Net.HttpWebRequestSystem.Net.HttpWebResponse類相關的類型,開發人員能夠利用這些類型實現 HTTP協議的客戶端功能。.NET Core 5 的 API Surface 與適用於 Windows 8.1 應用的 API 一致,這些接口相比於 .NET Framework 的外部接口限制更多。這是有意設置的,咱們強烈建議你們使用 HttpClient API--這是咱們將會集中精力,創新前進的方向。 .NET Core 5 的其餘部分,諸如 Windows Communication Foundation (WCF)也已經遷移到 .NET Cores 實現的 HttpClient,點擊此處查看概述。

提供該庫的目的是保證向後兼容性,讓使用舊 API 的 .NET 庫也能使用。對 .NET Core來講,HttpWebRequest的部署實際上基於HttpClient(與 .NET Framework中的依賴順序相反)。正如前文所述,這樣作是爲了不在 UWP 應用開發語境中使用受管理的 .NET HTTP 堆棧,同時將HttpClient轉變單個 HTTP 客戶端的 API。

不變的內容

Windows 8.1 Store 應用支持的 System.NetSystem.Net.NetworkInformation 命名空間中的其餘類型在 UWP 應用依舊可用。這些 API Surface 有少許添加項,但其實現方式並無大的變化。

展望將來

本文,咱們討論了爲 Windows 10 UWP 應用開發人員提供的首版 .NET 網絡 API。咱們將繼續完善這些接口、加入新的外部API,以確保開發人員可以使用 .NET 編寫豐富、功能齊全的 UWP 應用程序。

爲了確保咱們優先開發的重點 API 是大衆所需的,請讓咱們知道你的反饋--請及時告訴咱們 .NET Core 中遺漏的 API,以及在使用 UWP 應用時影響你體驗的因素。請在GitHub上建立或投票表決Windows platform missing APIs uservoice ,也能夠留下您的問題。咱們期待與您合做來開發兼容性更好的優質應用。

原文連接:http://blogs.msdn.com/b/dotnet/archive/2015/07/28/net-networking-apis-for-uwp-apps.aspx

OneAPM 助您輕鬆鎖定 .NET 應用性能瓶頸,經過強大的 Trace 記錄逐層分析,直至鎖定行級問題代碼。以用戶角度展現系統響應速度,以地域和瀏覽器維度統計用戶使用狀況。想閱讀更多技術文章,請訪問 OneAPM 官方博客

相關文章
相關標籤/搜索