HttpClient 与 HttpWebRequest

Posted

技术标签:

【中文标题】HttpClient 与 HttpWebRequest【英文标题】:HttpClient vs HttpWebRequest 【发布时间】:2014-03-06 04:26:35 【问题描述】:

我有一个大文件,我必须发送到 Web api 客户端...数据是多部分的。 问题是,如果文件是通过 http web 请求发送的,那么它会快速上传到 webapi。对于此请求,文件内容直接覆盖请求流。

如果通过 Httpclient (.net 4.5) 发送相同的文件,与 http web 请求相比,上传速度很慢。我在 Httpclient post async 中使用 multipartformdatacontent。

那么,对于大文件,我们必须只使用网络请求吗?或者 Httpclient 上是否有任何设置可以加快上传速度?

【问题讨论】:

HttpWebREquest 为单个请求建模。 HttpClient 模型,嗯,一个客户端——发出多个请求的东西。 HttpClient 是较新的,因此更有可能拥有最新的知识。虽然,我不知道它在某些领域是否特别快;但如果您在 WebAPI 空间或 REST 中做任何事情,当然更推荐。 HttpClient 在后台使用 HttpWebRequest 来实际发出 HTTP 请求,因此您应该能够获得相同的性能。 是的..但性能再次取决于内容如何通过客户端传递..我使用 FileStreamContent,现在我已更改为 ByteArrayContent... 【参考方案1】:

HttpClient 更像是一个无头浏览器。如果您要创建许多 http 请求,它是一个强大而理想的工具。例如,您可以设置默认标题和内容。以下是它与 HttpWebRequest 的 5 大不同之处,here 取自 here

    HttpClient 实例是配置扩展、设置默认标头、取消未完成的请求等的地方。 您可以通过单个 HttpClient 实例发出任意数量的请求。 HttpClients 不绑定到特定的 HTTP 服务器或主机;您可以使用相同的 HttpClient 实例提交任何 HTTP 请求。 您可以从 HttpClient 派生来为特定站点或模式创建专门的客户端 HttpClient 使用新的面向任务的模式来处理异步请求,从而大大简化了管理和协调多个未完成的请求。

【讨论】:

谢谢。这不回答我的问题。我对 postAsync 方法有一个等待,即使这也无济于事。想知道 webrequest 与 httpclient 相比如何更快? 通常推荐署名:blogs.msdn.com/b/henrikn/archive/2012/02/11/… 在帖子中两次署名和在 cmets 中的另一次很有趣... :-) 很好的答案。仅前 7 个字就可以解决很多“为什么我不能使用 HttpClient 抓取 xyz.com?” 链接中的资源使用的JsonArray好像不可用【参考方案2】:

我将 FileStreamContent 与 httpclient 一起使用...但是当我使用 ByteArrayContent 时,它运行良好。

我不确定这如何以及为什么会有所不同,但是通过流发送字节是一种更好的方式,而不是发送流

【讨论】:

您从哪里获得 FileStreamContent?这不是默认的内置 HttpContent 实现。 不。我很确定它不在其中任何一个中。 我的错..这是我在谈论的 StreamContent。 msdn.microsoft.com/en-us/library/… 在问题和答案中显示代码 sn-ps 会有所帮助。我推测您的字节数组比默认的流缓冲区大得多,这有助于 httpclient 以更少的开销发送它。【参考方案3】:

也许您在 using 块中实例化 HttpClient,这可以解释性能问题。例如。

  using (var httpClient = new HttpClient() )
  
      var result = await httpClient.GetAsync("http://example.com");
      Console.WriteLine(result.StatusCode);
  

这里 HttpClient 的实例在请求之后立即被释放,而它可以说是一个长期存在的对象(例如应用程序的生命周期)。

[编辑 - 添加上下文]

释放实例也会关闭连接,但会使套接字在设定的持续时间内处于等待状态。对于此代码的每次执行,操作系统都会尝试创建一个新的套接字连接,并且由于完成此操作的速度是有限的,因此可能会出现性能/可靠性问题。

重用相同的 HttpClient 实例意味着更好地重用打开的套接字和更有效地使用系统资源。

更多信息here。

【讨论】:

以上是关于HttpClient 与 HttpWebRequest的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient 标头与 HttpRequestMessage 标头

HttpClient 与 HttpWebRequest

HttpClient 静态与新

C#中HttpClient使用注意:预热与长连接

Angular 5 HttpClient 与以前的 Http 相比有啥优势?

(转)HttpURLConnection与 HttpClient 区别