【编者按】本文做者是 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
在 Windows 10 和 .NET Core 5 中,System.Net.Sockets
被添加到用于 UWP 应用开发的 API Surface 中。这是 Windows Store 应用期待已久的API( Windows Phone Silverlight 应用程序早已使用了此接口),它包含了System.Net.Sockets.Socket
和System.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及时向咱们反馈。服务器
开发者在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());
注释:异步
其余 .NET 平台并不支持将Request.Version
属性值设置为2.0,当该请求发出时会抛出System.ArgumentException
异常。除 UWP 外的其余 .NET 平台默认版本为1.1。
Request.Version
属性表示客户端 API 优先使用 HTTP/2 协议。实际使用的HTTP 版本取决于客户端操做系统、服务器和中间代理。HTTP/2 是一个协商协议,若是服务器或者中间代理不支持该协议,将会回退为 HTTP 1.1 版本。
在这一节中,咱们将回顾 Windows Store开发人员以前使用过的 API,在新版中起底层实现已经发生了显著变化。理解这些变化将会帮助你以一个开发者的视角,洞悉应用程序从 Windows 8.1 Store App 移植到 Windows 10 UWP 的过程当中发生的代码改动。
在 Windows 8.1 中, HttpClient
的实现基于 HTTP 协议栈,其包括的类型有System.Net.HttpWebRequest
和System.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.HttpWebRequest
、 System.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.Net
和System.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 官方博客。