Whats the difference between HttpClient.Timeout and using the WebRequestHandler timeout properties?
我可以直接使用HttpClient.Timeout设置HttpClient对象的超时,但是最近我读到了有关WebRequestHandler类的信息,该类是HttpClientHandler的派生类。
WebRequestHandler具有ReadWriteTimeout属性。 与HttpClient.Timeout一起使用时,这将如何影响请求的操作?
当执行SendAsync时,HttpClient.Timeout被放置在CancellationTokenSource上。这意味着此超时适用于整个异步操作。
另一方面,将WebRequestHandler.ReadWriteTimeout复制到HttpWebRequest,并在请求流上同时设置ReadTimeout和WriteTimeout。因此,这更多的是流级别的超时,最终是套接字级别的超时。
如果同时设置两者,则如果该操作总共花费的时间超过HttpClient.Timeout,它将超时;如果从流中进行的读取或写入花费的时间超过WebRequestHandler.ReadWriteTimeout,则它还将超时。尽管我不确定超时异常是否有所不同。
-
由于它与流有关,因此ReadWriteTimeout是否会影响Response.Content.ReadAsStringAsync? 目前,我在调用SendAsync时使用HttpCompletionOption.ResponseContentRead来确保在超时之前读取了内容,因为ReadAsStringAsync不允许显式超时或取消。 如果WebRequestHandler允许我设置读取内容流的超时时间,请改用HttpCompletionOption.ResponseHeadersRead。
-
从描述中很难描绘出您的用例,您可以通过编辑问题来发布相关代码吗?
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