c# - HttpClient 究竟是如何处理超时的?

标签 c# .net http networking httpclient

所以有两个超时属性可以在HttpClient上设置: HttpClient.TimeOutWebRequestHandler.ReadWriteTimeout .

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

现在后者 (ReadWriteTimeOut) - 至少在我看来 - 应该一直传播到 NetworkStream ,它会影响请求/响应流在超时之前可以阻塞(空闲)的时间。

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

In the case of asynchronous requests, it is the responsibility of the client application to implement its own time-out mechanism.

完全没有解释他们考虑的是哪种超时机制(网络流空闲超时?整个 HTTP GET 超时?等等),这让我很困惑。

所以我的问题是,HttpClient 究竟是如何处理网络/协议(protocol)超时的?我想使用 HttpClient 上传/下载可能较大的文件,因此我将 HttpClient.TimeOut 设置为无限。但我担心这样做会导致应用程序面临无限等待服务器/网络拒绝完成的某些事件的风险。

最佳答案

使用HttpClient下载文件时有2个选项

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

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

我想选项 2 正是您要寻找的。只需设置一个 HttpClient.Timeout 即可在合理的时间内从服务器获得响应,然后下载内容

关于c# - HttpClient 究竟是如何处理超时的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29851491/

相关文章:

.net - Visual Basic : Variable assignment with OR

asp.net - IIS 和静态内容?

java - 如何在服务器端为端口编写重试策略以监听客户端请求?

c# - 在 Unity 中使用 Windows 语音识别 API

c# - 多个 .WhenAny(...).ToPropertyEx(...) 调用是否应该相互覆盖?

.net - 寻找对象数据库

c# - Entity Framework 数据库优先,同表名和列名映射

c# - 离开屏幕保护程序或锁定计算机后程序挂起

c# - 如何在 PC 运行时识别 WOL(Wake On Lan)请求

rest - 未处理的异常:类型 'int'不是类型转换中类型 'String'的子类型