因此,可以在HttpClient上设置两个超时属性:HttpClient.TimeOut和WebRequestHandler.ReadWriteTimeout。
第一个只是整个请求/响应的超时,所以如果下载/上传时间超过这个,我运气不好,在转移过程中被切断,没有问题。显然可以通过将超时设置为无限来覆盖,但我不确定它会产生什么后果。
现在后者(ReadWriteTimeOut) - 至少根据我的理解 - 应该一直传播到NetworkStream,它会影响请求/响应流在超时之前阻塞(空闲)的时间。 / p>
HttpClient正在使用HttpWebRequest方法的异步版本,但正如here所述:
在异步请求的情况下,客户端应用程序有责任实现自己的超时机制。
根本没有解释他们想到的超时机制(网络流空闲超时?整个HTTP GET的超时等等),这让我非常困惑。
所以我的问题是,HttpClient究竟如何处理网络/协议超时?我想使用HttpClient上传/下载可能很大的文件,所以为此我将HttpClient.TimeOut设置为无限。但我担心,通过这样做,应用程序有可能无限期地等待服务器/网络拒绝完成的某些事件。
答案 0 :(得分:0)
使用HttpClient
下载文件时有2个选项在Get请求中使用HttpCompletionOption.ResponseContentRead
(这是默认的隐式选项)。然后HttpClient.Timeout
有效地应用于整个下载过程。我想当你想到无限超时时就是这种情况
在Get请求中明确使用HttpCompletionOption.ResponseHeadersRead
。然后,HttpClient.Timeout
仅适用于无内容的头部响应。
之后,您可以自己下载内容管理超时,例如response.Content.ReadAsStreamAsync()
我认为选项2是您所寻求的。只需设置一个HttpClient.Timeout
即可在合理的时间内从服务器获取响应,然后下载内容
答案 1 :(得分:-1)
你的引用是针对HttpWebRequest的。但是,HttpClient.Timeout(仅在.NET 4.5中工作)适用于HttpClient。因此,它在使用HttpClient API时处理超时。但是,将其设置为无限是一种不好的做法。在这种情况下,内部超时正在使用中,这将导致在大约10分钟后抛出异常(如果在.NET 4.5中未更改内部超时值)