System.Net.Http.HttpClient vs Windows.Web.Http.HttpClient - 主要区别是啥?

Posted

技术标签:

【中文标题】System.Net.Http.HttpClient vs Windows.Web.Http.HttpClient - 主要区别是啥?【英文标题】:System.Net.Http.HttpClient vs Windows.Web.Http.HttpClient - What are the main differences?System.Net.Http.HttpClient vs Windows.Web.Http.HttpClient - 主要区别是什么? 【发布时间】:2015-07-08 11:13:54 【问题描述】:

在为 Windows 开发 .NET 4.5 桌面应用程序时,我习惯于使用 System.Net.Http.HttpClient 与后端 Web API 进行所有通信。我现在正在开发一个 Windows 应用商店应用程序,并注意到 Windows.Web.Http.HttpClient 的存在。我一直在寻找有关这两个客户之间主要区别的信息,但没有任何运气。

From MSDN 我知道我应该开始在我的 Windows 应用商店应用程序中使用 Windows.Web.Http.HttpClient,因为 System.Net.Http.HttpClient 可能会从 API 中删除:

注意 System.Net.Http 和 System.Net.Http.Headers 命名空间在未来的 Windows 版本中可能无法供 Windows 应用商店应用使用。从 Windows 8.1 和 Windows Server 2012 R2 开始,在 Windows.Web.Http 命名空间以及相关的 Windows.Web.Http.Headers 和 Windows.Web.Http.Filters 命名空间中使用 Windows.Web.Http.HttpClient 来代替 Windows 运行时应用.

但是除了这些信息之外,我很难弄清楚使用Windows.Web.Http.HttpClient 的主要区别是什么以及主要的好处是什么?它增加了什么是我们在System.Net.Http.HttpClient 中没有的?

非常感谢官方文档支持的答案。

【问题讨论】:

可能是依赖关系。 System.Net.Http 可能依赖于 .NET 或 Win32 模块或函数,这些模块或函数可能不适用于从 Windows 10 开始的应用商店应用。 【参考方案1】:

Windows.Web.Http 是一种 WinRT API,支持所有 WinRT 编程语言:C#、VB、C++/CX 和 javascript。这使您可以选择用您选择的语言编写相同的代码。

System.Net.Http 是一个 .NET API,仅适用于 C# 和 VB 开发人员。

Windows.Web.Http 的优势

WinRT API 是用本机代码编写的,这意味着更好的性能。 Windows.Web.Http 位于通用 Windows HTTP 堆栈之上,并重用已被其他 Windows 组件使用的资源。 System.Net.Http 是其他 Windows 组件不经常使用的 HTTP 协议的单独实现。因此,在某些情况下,您可以通过选择 Windows.Web.Http 来节省资源。 Windows.Web.Http与IInputStreamIOutputStreamIBuffer等WinRT类型有更好的集成。在某些情况下,避免将System.IO.Stream 转换为IInputStreamIOutputStreamSystem.Array 转换为Windows.Storage.Streams.IBuffer 的.NET 扩展可以提高性能并节省资源。 Windows.Web.Http新增HTTP/2 support等特性。 Windows.Web.Http 是基于 COM 的,可以被任何理解 COM 的编程语言使用。

System.Net.Http 的优势

System.Net.Http 自 Windows 8 或 .NET 4.5 起可用,而 Windows.Web.Http 仅从 Windows 8.1 和 Windows Phone 8.1 起可用。 使用 System.Net.Http 将 WinRT 代码直接移植到 ASP.NET 或 Xamarin(可移植类库) Windows 8 和 8.1 项目或桌面项目:† 根据HttpClient (example) 隔离身份验证标头和凭据 根据HttpClient 隔离的 Cookie 容器 不缓存 HTTP 响应,因此后续请求永远不会来自缓存,这是未设置正确 Cache-Control 标头 (example) 的服务器的常见问题 适用于System.Net.NetworkCredential

† 对于 Windows 通用项目 (UWP),System.Net.Http 是 Windows.Web.Http 之上的包装器,如 here 所述。

延伸阅读:Demystifying HttpClient APIs in the Universal Windows Platform

【讨论】:

【参考方案2】:

关于它的信息并不多。我想到的一些事情:

新 API 不像当前 API 那样依赖于某些低级 Windows 函数。 新的 API 能够更好地处理与 HTTP 协议相关的新方法,例如 WebSockets 等。

一些有用的信息可以在this blog post 中找到,它也引用了this Build video。他们谈到了更好的缓存控制,以及添加过滤器以进行身份​​验证、轻松访问 cookie、重新连接等的方法。

【讨论】:

这很有意义。感谢您分享您的想法。我也看过 Build 视频的部分内容,我不得不承认,我无法理解 MS 如何花时间宣传这个新客户端,然后没有提供它与现有 System.Net.Http.HttpClient 的区别以及如何使用这个集合的详细信息的新功能。但无论如何,再次感谢。

以上是关于System.Net.Http.HttpClient vs Windows.Web.Http.HttpClient - 主要区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章