Dis*_*nky 2 c# httpclient httpwebrequest
在我的场景中,我必须将数据从一个 Web 应用程序发送到一个有效的数据存储 webapi。请求必须是同步的,Exception如果出现问题,我绝对希望抛出,因为这意味着应用程序的关键部分不可用。
这是现有问题的衍生,但不是重复;为什么使用 HttpClient 进行同步连接。
然而一遍又一遍,包括在我上面看到的文章中,我看到一致的建议使用HttpClient,即使在同步场景中也是如此。我看到的最好的原因是上面 SO 帖子中接受的答案,但它基本上归结为;
使用它是因为“闪亮”。
对于我的场景,我不喜欢这是一个可接受的答案。我更愿意为手头的任务使用正确的对象,这似乎是较旧的HttpWebRequest. 甚至 Ben Watson 的优秀资源“编写高性能 .NET 代码”也说明了以下内容;
另一个例子是
System.Net.HttpWebRequest类,如果它收到来自服务器的非 200 响应,它将抛出异常。幸运的是,这种奇怪的行为System.Net.Http.HttpClient在 .NET 4.5的类中得到了纠正
但在我的情况,我其实不希望这样的行为。虽然 有很多很好的用例HttpClient,但谁能提供一个不在HttpWebRequest我的场景中使用的好理由?我是否使用了正确的对象?更重要的是,为什么?
HttpClient旨在提供对 http 协议的更多控制,在其他地方做同样的事情HttpWebRequest或WebClient不是那么直接。除了异步,还有很多好处HttpClient
的好处 HttpClient
最大的好处HttpClient是插件架构,可以让你轻松改变 HTTP 协议的底层行为。
HttpClient是可扩展的,底层HttpMessageHandler允许您完全绕过底层 Microsoft 的 HttpClient 实现,您可以插入自己的实现。例如,在 iOS 和 Android 中,我们可以使用原生 Http 堆栈,而不是使用 .Net 的 HttpClient。HttpMessageHandlerCancellationToken 当我们想要取消长时间运行的 Http 请求时,支持非常好。 HttpClient经过优化,可以使用单个实例管理多个请求。在不使用太多锁的情况下非常有效地利用了 CPU 时间(同步操作依赖于锁,这对 CPU 来说是相当大的开销)。今天,我们生活在微服务的世界。在有许多客户端要服务的服务器和移动操作系统中,CPU 时间很昂贵。缺点
唯一的缺点是async/await,在不使用 Task Runner 或死锁的情况下,您不能简单地在同步代码中轻松使用异步库。尽管有许多库支持如何同步使用异步代码。
有HttpClient大量 CPU 时间作为备用的桌面应用程序没有很大的好处。