【编者按】本文作者是 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 与功能。

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 协议的最新版本,通过最小化连接和往返信息的数量提供了低延迟的网络访问方式。在 HttpClientAPI 中使用该协议意味着服务器响应更快,应用程序在相同的网速下运行更加流畅。最棒的是——该功能默认生效的,无需对代码做任何改动即可使用之。了解 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());  

注释:

  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 组件,例如基于 WinINetWindows.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 官方博客