11

I can set the timeout of my HttpClient object directly with HttpClient.Timeout but I've recently read about the WebRequestHandler class which is a derivative of HttpClientHandler.

WebRequestHandler has a ReadWriteTimeout property. How will this affect the operation of the request when used alongside HttpClient.Timeout?

Arindam Nayak
  • 7,346
  • 4
  • 32
  • 48
iguanaman
  • 930
  • 3
  • 13
  • 25

2 Answers2

23

When you perform a SendAsync the HttpClient.Timeout is placed on the CancellationTokenSource. This means this timeout is for the entire async operation.

On the other hand, WebRequestHandler.ReadWriteTimeout is copied to the HttpWebRequest where it is set on the request stream both ReadTimeout and WriteTimeout. So this is more a timeout at the stream level, which is ultimately a socket level timeout.

If you set both, then if the operation takes more than HttpClient.Timeout in total it will timeout, and if a read or write from the stream takes longer than WebRequestHandler.ReadWriteTimeout it will also timeout. Though I am not sure if there is a difference in the timeout exceptions raised.

weston
  • 54,145
  • 21
  • 145
  • 203
  • Since it's related to streams, would `ReadWriteTimeout` affect `Response.Content.ReadAsStringAsync` then? At the moment I use `HttpCompletionOption.ResponseContentRead` when calling `SendAsync` to make sure the content is read before the timeout, because `ReadAsStringAsync` doesn't allow an explicit timeout or cancellation. I'd like to use `HttpCompletionOption.ResponseHeadersRead` instead, if `WebRequestHandler` allows me to set a timeout on reading the content stream. – iguanaman Oct 11 '14 at 10:18
  • It's a bit hard to picture your use case from the description, can you post the relevant code by editing the question? – weston Oct 11 '14 at 18:35
1

WebRequestHandler.ReadWriteTimeout - Gets or sets a time-out in milliseconds when writing a request to or reading a response from a server.

HttpClient.Timeout - Gets or sets the TimeSpan to wait before the request times out.

Here, WebRequestHandler is a wrapper over HTTPClient WebRequestHandler derives from HttpClientHandler but adds properties that generally only are available on full .NET. To conclude, it is more on less same thing.

For more info refer this link - http://blogs.msdn.com/b/henrikn/archive/2012/08/07/httpclient-httpclienthandler-and-httpwebrequesthandler.aspx

Jon Adams
  • 24,464
  • 18
  • 82
  • 120
Arindam Nayak
  • 7,346
  • 4
  • 32
  • 48