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
,它在ReadTimeout
和WriteTimeout
的请求流上设置。所以这更像是流级别的超时,最终是套接字级别的超时。
如果您同时设置两者,那么如果操作的总时间超过HttpClient.Timeout
,它将超时,如果从流中读取或写入的时间超过WebRequestHandler.ReadWriteTimeout
,它也会超时。虽然我不确定引发的超时异常是否有所不同。
【讨论】:
既然和stream有关,那么ReadWriteTimeout
会影响Response.Content.ReadAsStringAsync
吗?目前我在调用SendAsync
时使用HttpCompletionOption.ResponseContentRead
以确保在超时之前读取内容,因为ReadAsStringAsync
不允许显式超时或取消。如果WebRequestHandler
允许我设置读取内容流的超时时间,我想改用HttpCompletionOption.ResponseHeadersRead
。
从描述中描绘你的用例有点困难,你可以通过编辑问题发布相关代码吗?【参考方案2】:
WebRequestHandler.ReadWriteTimeout
- 在向服务器写入请求或从服务器读取响应时获取或设置超时(以毫秒为单位)。
HttpClient.Timeout
- 获取或设置TimeSpan
在请求超时之前等待。
这里,WebRequestHandler
是 HTTPClient
的包装器
WebRequestHandler
派生自 HttpClientHandler
,但添加了通常仅在完整 .NET 上可用的属性。
总而言之,它更多的是在更少的同一件事上。
有关更多信息,请参阅此链接 - http://blogs.msdn.com/b/henrikn/archive/2012/08/07/httpclient-httpclienthandler-and-httpwebrequesthandler.aspx
【讨论】:
以上是关于HttpClient.Timeout 和使用 WebRequestHandler 超时属性有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章