为什么在HttpWebRequest上使用HttpClient进行同步请求

时间:2017-08-01 16:28:45

标签: c# httpwebrequest httpclient

在我的场景中,我必须将数据从一个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的充分理由吗?我是否使用了正确的物体?更重要的是,为什么

3 个答案:

答案 0 :(得分:4)

HttpClient旨在提供对http协议的更多控制,其他在HttpWebRequestWebClient中执行此操作的方式并非如此直接。除了异步之外,HttpClient

还有很多好处

HttpClient

的好处

HttpClient的最大好处是插件架构,可让您轻松更改HTTP协议的基本行为。

  1. HttpClient是可扩展的,基础HttpMessageHandler允许您完全通过底层Microsoft的HttpClient实现,您可以插入自己的实现。例如,在iOS和Android中,我们可以使用原生的Http堆栈,而不是使用.Net的HttpClient。
  2. 通过自定义HttpMessageHandler
  3. 可以轻松替换缓存,Cookie 当我们要取消长时间运行的Http请求时,
  4. CancellationToken支持非常好。
  5. 没有闪亮,但重要的是,多线程,HttpClient已经过优化,可以使用单个实例管理多个请求。在不使用太多锁的情况下非常有效地利用CPU时间(同步操作依赖于锁,这在CPU上是相当大的开销)。今天,我们生活在微服务世界。在具有许多客户端和服务器的服务器中,CPU时间成本很高。
  6. <强>缺点

    唯一的缺点是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