为 UWP 应用提供的 .NET 网络 API - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
OneAPM
V2EX    OneAPM

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

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

    [编者按] 本文作者是 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 应用性能瓶颈,通过强大的 race 记录逐层分析,直至锁定行级问题代码。以用户角度展示系统响应速度,以地域和浏览器维度统计用户使用情况。想阅读更多技术文章,请访问 OneAPM 官方博客

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     922 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 20:26 PVG 04:26 LAX 12:26 JFK 15:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86