HttpClient如何处理超时?

时间:2015-04-24 15:27:09

标签: c# .net http networking httpclient

因此,可以在HttpClient上设置两个超时属性:HttpClient.TimeOutWebRequestHandler.ReadWriteTimeout

第一个只是整个请求/响应的超时,所以如果下载/上传时间超过这个,我运气不好,在转移过程中被切断,没有问题。显然可以通过将超时设置为无限来覆盖,但我不确定它会产生什么后果。

现在后者(ReadWriteTimeOut) - 至少根据我的理解 - 应该一直传播到NetworkStream,它会影响请求/响应流在超时之前阻塞(空闲)的时间。 / p>

HttpClient正在使用HttpWebRequest方法的异步版本,但正如here所述:

  

在异步请求的情况下,客户端应用程序有责任实现自己的超时机制。

根本没有解释他们想到的超时机制(网络流空闲超时?整个HTTP GET的超时等等),这让我非常困惑。

所以我的问题是,HttpClient究竟如何处理网络/协议超时?我想使用HttpClient上传/下载可能很大的文件,所以为此我将HttpClient.TimeOut设置为无限。但我担心,通过这样做,应用程序有可能无限期地等待服务器/网络拒绝完成的某些事件。

2 个答案:

答案 0 :(得分:0)

使用HttpClient

下载文件时有2个选项
  1. 在Get请求中使用HttpCompletionOption.ResponseContentRead(这是默认的隐式选项)。然后HttpClient.Timeout有效地应用于整个下载过程。我想当你想到无限超时时就是这种情况

  2. 在Get请求中明确使用HttpCompletionOption.ResponseHeadersRead。然后,HttpClient.Timeout仅适用于无内容的头部响应。 之后,您可以自己下载内容管理超时,例如response.Content.ReadAsStreamAsync()

  3. 我认为选项2是您所寻求的。只需设置一个HttpClient.Timeout即可在合理的时间内从服务器获取响应,然后下载内容

答案 1 :(得分:-1)

你的引用是针对HttpWebRequest的。但是,HttpClient.Timeout(仅在.NET 4.5中工作)适用于HttpClient。因此,它在使用HttpClient API时处理超时。但是,将其设置为无限是一种不好的做法。在这种情况下,内部超时正在使用中,这将导致在大约10分钟后抛出异常(如果在.NET 4.5中未更改内部超时值)