在我的场景中,我必须将数据从一个Web应用程序发送到webapi,这是一个有效的数据存储。这些请求必然是同步的,如果出现问题,我肯定希望抛出Exception
,因为这意味着应用程序的关键部分不可用。
这是现有问题的衍生物,但不是重复; Why use HttpClient for Synchronous Connection
然而,一遍又一遍,包括我在上面看到的文章中,我看到了使用HttpClient
的一致建议,即使在同步场景中也是如此。我所见过的最好的理由是上面的SO帖子中接受的答案,但它基本上归结为;
使用它是因为"有光泽"。
我不喜欢我的情景作为可接受的答案。我更喜欢使用正确的对象来完成手头的任务,这似乎是较旧的HttpWebRequest
。甚至Ben Watson的优秀资源"编写高性能.NET代码"陈述以下内容;
另一个例子是
System.Net.HttpWebRequest
类,它会 如果从服务器收到非200响应,则抛出异常。 幸好纠正了这种奇怪的行为 .NET 4.5中的System.Net.Http.HttpClient
类
但在我的场景中,我实际上做想要这种行为。虽然HttpClient
有很多好的用例,但是有人可以提供一个不在我的场景中使用HttpWebRequest
的充分理由吗?我是否使用了正确的物体?更重要的是,为什么?
答案 0 :(得分:4)
HttpClient
旨在提供对http协议的更多控制,其他在HttpWebRequest
或WebClient
中执行此操作的方式并非如此直接。除了异步之外,HttpClient
HttpClient
HttpClient
的最大好处是插件架构,可让您轻松更改HTTP协议的基本行为。
HttpClient
是可扩展的,基础HttpMessageHandler
允许您完全通过底层Microsoft的HttpClient实现,您可以插入自己的实现。例如,在iOS和Android中,我们可以使用原生的Http堆栈,而不是使用.Net的HttpClient。HttpMessageHandler
CancellationToken
支持非常好。 HttpClient
已经过优化,可以使用单个实例管理多个请求。在不使用太多锁的情况下非常有效地利用CPU时间(同步操作依赖于锁,这在CPU上是相当大的开销)。今天,我们生活在微服务世界。在具有许多客户端和服务器的服务器中,CPU时间成本很高。<强>缺点强>
唯一的缺点是async/await
,您无法在同步代码中轻松使用异步库而无需使用任务运行器或死锁。虽然有许多库支持如何同步使用异步代码。
HttpClient
在桌面应用程序上没有很大的好处,有大量的CPU时间作为备用。
答案 1 :(得分:1)
HttpClient
的行为被视为&#34;更清洁&#34;因为来自服务器的非成功响应并不一定意味着出现了问题。虽然您的情况并非如此,但想象一下想要检查资源不的流程,并期望它通常不存在。使用HttpWebRequest
时,正常的执行流会引发异常,这种异常很严重并且可能会使事情变得复杂,而HttpClient
却没有。
对于您的具体情况,区别可能无关紧要。程序中的其他情况可能更喜欢HttpClient
行为,并且在单个HTTP客户端上进行标准化而不是必须兼顾两个。
答案 2 :(得分:1)
HttpClient不是WebClient / HttpWebRequest的替代品。 HttpWebRequest为您提供了更大的灵活性,但同时它使您的代码更加冗长。 HttpClient提供简单的界面。如果您真的想要其他功能,可以在HttpClient上使用HttpWebRequest。
根据非200响应代码异常,HttpClient提供了一种模拟该行为的方法。你必须调用
response.EnsureSuccessStatusCode();
有关详细信息,请访问Usage of EnsureSuccessStatusCode and handling of HttpRequestException it throws