HttpWebRequests的ReadWriteTimeout似乎默认为5分钟。
有什么理由说它那么高吗?我试图将API调用的超时设置为10秒,但它旋转超过2分钟。
当我将此设置为30秒时,它会在合理的时间内超时。
将此设置得太低会有危险吗?
我无法想象在我的应用中需要花费超过20-30秒的时间(小的2-30kb有效载荷)。
参考:http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.readwritetimeout.aspx
答案 0 :(得分:24)
确定有5分钟超时的原因。它看起来像这样:
这个装置是国际射电天文研究中心使用的机器人磁带检索系统。它存储32.5 PB的历史数据。当其服务器获得HttpWebRequest时,机器会发送机器人以检索带有数据的磁带。这可能需要一段时间,正如您可能想象的那样。
十年前,这些系统在.NET设计时非常普遍。与此同样,硬盘存储容量的不断改进使它们已经过时了。虽然超过5 PB的SAN存储仍然可以为您提供相当大的资金。如果速度不是必不可少的,那么磁带很难被击败。
显然,当.NET不知道线路另一端发生了什么时,它不可能可靠地声明超时。所以默认值很高。如果您有充分的理由相信您的特定设置有上限,请不要犹豫,降低它。确保它成为一个可编辑的设置,你无法预测未来。
答案 1 :(得分:7)
您无法知道用户连接到您网站的连接速度。作为此框架的创建者,您无法知道开发人员将托管的内容。这个类已经存在于.NET 1.1中,所以很长一段时间。那时用户的速度也较慢。
找到一个好的默认值非常困难。您不希望将其设置得太高以防止出现安全漏洞,并且您不希望将其设置得太低,因为这会导致一百万(夸大的)线程和请求中止请求。
对不起,我不能给你任何官方消息来源,但这是合理的。
答案 2 :(得分:3)
为什么5分钟?为什么不? JustAnotherUserYouMayKnow向你解释说得很好。 但是像往常一样,您可以自由地将此默认值更改为适合您的情况的值,因此请随意遵循Christian指出的路径。
当我们谈论数百万用户并且涉及数百万可能的情景时,设置默认值并非易事。
引导线是它为什么它是5分钟并不是那么重要,而是你如何根据自己的需要调整它。
答案 3 :(得分:0)
通过设置它可能会或可能会引入一系列问题。由于您可以在合理的时间内到达网站,其他人可能不会。
一个完美的例子是Verizon,他们调用了一系列Proxy Servers
,它可以大大降低连接速度。我之所以提出这样一个例子的原因;是我们的应用程序在抛出异常之前指定了一分钟Timeout
。
我们的服务器没有大量请求的问题,它很容易处理它们。但是,我们全球的一些用户收到此错误:错误10060 。
问题可能来自实际处理Proxy Configuration
请求的错误Invalid Registry Key
或Timeout
。
你认为一分钟确实足够快,但实际上并非如此。与此客户特定网络一样,它不会足够快地抽取数据,从而导致错误。
所以你问:
为什么HttpWebRequest ReadWrite Timeout默认为五分钟?
他们试图解释最低的共同点。
简单地说,每个网络和客户端在移动到所需位置时可能会有很大程度的流量或延迟。如果它无法到达您的端口内的目的地理想套接字请求,您的用户将遇到异常。
关于网络的一些非常重要的事情:
这些是您必须考虑的一些变量。如果我们在谈论互联网;每个客户都有一个家庭网络;连接到ISP;它连接到互联网;它连接到你。因此,您可以聚合多种形式的流量。
如果我们谈论的是内联网,使用大多数现代技术,你的时间成为一个问题的可能性很小但仍然可能。
此外,每台计算机都可能会分享或导致问题。在Windows 8中,为浏览器指定的默认Timeout
为一分钟;在某些情况下,这些用户可能会遇到与您的应用程序,您的网站或其他人的异常。因此,您手动更改注册表中的ServerTimeOut
和TimeOut
键以分配更长的值。
简而言之:
这些都是需要考虑的变量;因为它们会影响对您的应用程序的访问。不幸的是,在推出并且用户开始使用您的网站之前,您无法确定。
不幸的是,你不知道你指定的时间是否足够;但它默认为更高的数字,因为全世界有太多的变化,它试图考虑最低的共同点。因为你的目标是尽可能多的人。
顺便提一句非常好的问题,到目前为止还有一些很棒的答案。