V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
OneAPM
V2EX  ›  OneAPM

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

  •  
  •   OneAPM · 2015-12-08 13:08:52 +08:00 · 4874 次点击
    这是一个创建于 3280 天前的主题,其中的信息可能已经有所发展或是发生改变。

    [编者按] 本文作者是 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 官方博客

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2461 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:45 · PVG 12:45 · LAX 20:45 · JFK 23:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.