HttpClient.Timeout 和使用 WebRequestHandler 超时属性有啥区别?

Posted

技术标签:

【中文标题】HttpClient.Timeout 和使用 WebRequestHandler 超时属性有啥区别?【英文标题】:Whats the difference between HttpClient.Timeout and using the WebRequestHandler timeout properties?HttpClient.Timeout 和使用 WebRequestHandler 超时属性有什么区别? 【发布时间】:2014-12-06 10:26:25 【问题描述】:

我可以直接用HttpClient.Timeout 设置我的HttpClient 对象的超时,但我最近读到了WebRequestHandler 类,它是HttpClientHandler 的派生类。

WebRequestHandler 有一个ReadWriteTimeout 属性。与HttpClient.Timeout 一起使用时,这将如何影响请求的操作?

【问题讨论】:

【参考方案1】:

当您执行SendAsync 时,HttpClient.Timeout 被放置在CancellationTokenSource 上。这意味着此超时适用于整个异步操作。

另一方面,WebRequestHandler.ReadWriteTimeout 被复制到HttpWebRequest,它在ReadTimeoutWriteTimeout 的请求流上设置。所以这更像是流级别的超时,最终是套接字级别的超时。

如果您同时设置两者,那么如果操作的总时间超过HttpClient.Timeout,它将超时,如果从流中读取或写入的时间超过WebRequestHandler.ReadWriteTimeout,它也会超时。虽然我不确定引发的超时异常是否有所不同。

【讨论】:

既然和stream有关,那么ReadWriteTimeout会影响Response.Content.ReadAsStringAsync吗?目前我在调用SendAsync 时使用HttpCompletionOption.ResponseContentRead 以确保在超时之前读取内容,因为ReadAsStringAsync 不允许显式超时或取消。如果WebRequestHandler 允许我设置读取内容流的超时时间,我想改用HttpCompletionOption.ResponseHeadersRead 从描述中描绘你的用例有点困难,你可以通过编辑问题发布相关代码吗?【参考方案2】:

WebRequestHandler.ReadWriteTimeout - 在向服务器写入请求或从服务器读取响应时获取或设置超时(以毫秒为单位)。

HttpClient.Timeout - 获取或设置TimeSpan 在请求超时之前等待。

这里,WebRequestHandlerHTTPClient 的包装器 WebRequestHandler 派生自 HttpClientHandler,但添加了通常仅在完整 .NET 上可用的属性。 总而言之,它更多的是在更少的同一件事上。

有关更多信息,请参阅此链接 - http://blogs.msdn.com/b/henrikn/archive/2012/08/07/httpclient-httpclienthandler-and-httpwebrequesthandler.aspx

【讨论】:

以上是关于HttpClient.Timeout 和使用 WebRequestHandler 超时属性有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

突然无法更改 HttpClient 上的超时

C# HttpClient 不处理 304/307 重定向

性能测试工具(jmeter运行优化)

微擎we7模块和模板安装方法

开源CMS的忠实粉丝——We7

js和jq倒计时10S