【编者按】本文作者是 Windows networking 团队项目经理 Sidharth Nabar。在微软 Build 2015 大会上,.NET Core 5 作为开发 UWP(Universal Windows Platform)应用的最新 .NET 版本正式发布,本文系OneAPM 工程师编译整理。
.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 不存在被删除或弃用的状况)。
如果比较 .NET Framework 与 .NET Core,我们会发现:尽管 .NET Core 中的大部分外部 API 与之前 .NET Framework 版的相同,但这些 API 的底层实现已经发生了显著变化,我们也通过此次版本迭代实现了网络 API 部署的现代化 ,使之更适用于 Windows 应用商店中的 App。在本文中,我们会列举 UWP 开发人员可用的全部 .NET 网络 API,并介绍其实现原理。
请注意:本文所讨论的 API 及其变化仅适用于开发 UWP App 的 .NET Core,并不适用于 .NET Framework 4.6 版本。我们同样致力于优化 .NET Core 网络 API 以更好地支持服务器平台(如 ASP .NET 5),这些内容将在另一篇博客中单独介绍。同样,本文也不会介绍 Windows 应用开发者不可用的 .NET 网络 API。
以下为 .NET Core 5中为 UWP 应用开发者新加的 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 版本:
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 的 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 官方博客。