HttpClient与HttpWebRequest

问题描述 投票:41回答:3

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

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

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

c#-4.0 asp.net-web-api dotnet-httpclient
3个回答
43
投票

HttpClient更像是一个无头浏览器。如果您要创建许多http请求,它是一个功能强大且理想的工具。例如,您可以设置默认标题和内容。以下是与HttpWebRequest取得的here不同的前五种方式

  1. HttpClient实例是配置扩展,设置默认标头,取消未完成请求等的地方。
  2. 您可以通过单个HttpClient实例发出任意数量的请求。
  3. HttpClients不依赖于特定的HTTP服务器或主机;您可以使用相同的HttpClient实例提交任何HTTP请求。
  4. 您可以从HttpClient派生为特定站点或模式创建专用客户端
  5. HttpClient使用新的面向任务的模式来处理异步请求,使得管理和协调多个未完成的请求变得非常容易。

3
投票

我正在使用带有httpclient的FileStreamContent ......但是当我使用ByteArrayContent时,它运行正常。

我不确定这是如何以及为什么会产生差异,但在流上发送字节是一种更好的方式,而不是发送流


3
投票

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

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

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

[编辑 - 添加上下文]

处置实例也会关闭连接,但会使套接字处于等待状态一段时间。对于此代码的每次执行,操作系统将尝试创建新的套接字连接,并且由于对其完成速度的限制,可能会出现性能/可靠性问题。

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

更多信息here

© www.soinside.com 2019 - 2024. All rights reserved.