Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is the HttpWebRequest ReadWriteTimeout set to 5 minutes?

The ReadWriteTimeout for HttpWebRequests seems to be defaulted to 5 minutes.

Is there a reason why it is that high? I was trying to set the timeout of an API call to 10 seconds, but it was spinning for a over 2 minutes.

WHen I set this to 30 seconds, it times out in a reasonable amount of time now.

Is it dangerous to set this too low?

I can't imagine something taking longer than 20-30 seconds in my application (small 2-30kb payloads).

Reference: http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.readwritetimeout.aspx

like image 854
loyalflow Avatar asked Jan 25 '13 21:01

loyalflow


2 Answers

Sure there's a reason for a 5 minute time-out. It looks like this:

enter image description here

This contraption is a robotic tape retrieval system, used by the International Centre for Radio Astronomy Research. It stores 32.5 petabytes of historical data. When its server gets an HttpWebRequest, the machine sends the robot on its way to retrieve the tape with the data. This takes a while, as you might imagine.

These systems were quite common a decade ago, around the time .NET was designed. Not so much today, the unrelenting improvements in hard disk storage capacity made them close to obsolete. Although more than 5 petabyte of SAN storage still sets you back a rather major chunk of money. If speed is not essential then tape is hard to beat.

Clearly .NET cannot possibly reliably declare a timeout when it doesn't know anything about what's happening on the other end of the wire. So the default is high. If you have good reasons to believe that there's an upper limit on your particular setup then don't hesitate to lower it. Do make it an editable setting, you can't predict the future.

like image 101
Hans Passant Avatar answered Oct 19 '22 09:10

Hans Passant


You can't possibly know what connection speed the users have that connect to your website. And as the creator of this framework you can't know either what the developer will host. This class already existed in .NET 1.1, so for a very long time. And back then the users had slower speed too.

Finding a good default value is very difficult. You don't want to set it too high to prevent security flaws, and you don't want to set it too low because this would result in a million (exaggerated) threads and requests about aborted requests.

I'm sorry I can't give you any official sources, but this is just reasonable.

like image 21
JustAnotherUserYouMayKnow Avatar answered Oct 19 '22 09:10

JustAnotherUserYouMayKnow