在我的场景中,我必须将数据从一个 Web 应用程序发送到 webapi,这是一种有效的数据存储。请求必须是同步的,我绝对希望在出现问题时抛出 Exception,因为这意味着应用程序的关键部分不可用。
这是现有问题的派生,但不是重复; Why use HttpClient for Synchronous Connection .
然而,包括在我上面看到的文章中,我看到了使用 HttpClient 的一致建议,即使在同步场景中也是如此。我看到的最好的理由是上面 SO 帖子中接受的答案,但它基本上归结为;
Use this because "shiny".
我不喜欢将其作为我的场景的可接受答案。我更愿意为手头的任务使用正确的对象,这似乎是较旧的 HttpWebRequest。甚至 Ben Watson 的优秀资源“编写高性能 .NET 代码”也指出以下内容;
Another example is the
System.Net.HttpWebRequestclass, which will throw an exception if it receives a non-200 response from a server. This bizarre behavior is thankfully corrected in theSystem.Net.Http.HttpClientclass in .NET 4.5
但在我的场景中,我实际上确实想要这种行为。虽然 HttpClient 有很多好的用例,但谁能提供一个很好的理由在我的场景中不使用 HttpWebRequest?我是否使用了正确的对象?更重要的是,为什么?
请您参考如下方法:
HttpClient 旨在提供对 http 协议(protocol)的更多控制,而在 HttpWebRequest 或 WebClient 中做同样的事情并不是那么简单。除了异步,HttpClient
HttpClient的好处
HttpClient 的最大好处是插件架构,它让您可以轻松更改 HTTP 协议(protocol)的底层行为。
HttpClient是可扩展的,底层HttpMessageHandler允许您完全绕过底层 Microsoft 的 HttpClient 实现,您可以插入自己的实现。例如,在 iOS 和 Android 中,我们可以使用原生 Http 堆栈,而不是使用 .Net 的 HttpClient。- 通过自定义
HttpMessageHandler可以轻松替换缓存、cookies 当我们想要取消长时间运行的 Http 请求时,
CancellationToken支持非常出色。- 不是很 Shiny ,但很重要,多线程,
HttpClient已优化以使用单个实例管理多个请求。 CPU 时间得到了非常有效的利用,而无需使用太多锁(同步操作依赖于锁,这对 CPU 来说是相当大的开销)。今天我们生活在微服务的世界里。在有许多客户端服务的服务器和移动操作系统中,CPU 时间是昂贵的。
缺点
唯一的缺点是 async/await,您不能在不使用 Task Runner 或死锁的情况下简单地在同步代码中轻松使用异步库。尽管有很多库支持如何同步使用异步代码。
HttpClient 在有大量 CPU 空闲时间的桌面应用程序上没有太大的好处。
