为 UWP 应用提供的 .NET 网络 API

2015-12-08 13:08:52 +08:00
 OneAPM

[编者按] 本文作者是 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 组件,例如基于 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 官方博客

4935 次点击
所在节点    OneAPM
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/241964

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX