我相信经过长时间的研究和搜索,我发现我想要做的事情可能更好地服务于建立一个异步连接并在所需的超时之后终止它.但无论如何我还是会问的!
快速代码片段:
HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create(url);
webReq.Timeout = 5000;
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
// this takes ~20+ sec on servers that aren't on the proper port, etc.
我有一个HttpWebRequest
方法,它位于一个多线程应用程序中,在这个应用程序中,我连接到大量的公司web服务器。在服务器没有响应的情况下,即使我指定的超时时间仅为5秒,HttpWebRequest.GetResponse()
仍要花费大约20秒的时间来超时。为了定期通过服务器,我想跳过那些连接时间超过5秒的服务器。
因此,问题是:“是否有一种简单的方法来指定/减少WebRequest或HttpWebRequest的连接超时?”
发布于 2009-10-01 02:41:24
我认为问题在于,WebRequest
只在请求实际提出之后才测量时间。如果您将多个请求提交到相同的地址,那么ServicePointManager
将限制您的请求,并且实际上只提交与相应的ServicePoint.ConnectionLimit
值相同的并发连接,在默认情况下,该值来自ServicePointManager.DefaultConnectionLimit
。应用程序CLR主机将此设置为2,ASP主机设置为10。因此,如果有一个向同一主机提交多个请求的多线程应用程序--实际上只有两个请求被放置在同一主机上,其余的将排队等待。
我还没有找到确凿的证据来研究这个问题是否真的会发生,但在类似的项目中,我的情况很糟糕,直到我取消了ServicePoint
限制。
另一个需要考虑的因素是DNS查找时间。同样,我的信念没有确凿的证据支持,但我认为WebRequest
不会将DNS查找时间与请求超时计算在内。在某些部署中,DNS查找时间可以显示为非常大的时间因素。
是的,你必须在WebRequest.BeginGetRequestStream
(POST
和内容)和WebRequest.BeginGetResponse
(GET
和POSTS
)周围编写应用程序。同步调用不会扩展(我不会详细说明原因,但我确实有确凿的证据)。无论如何,ServicePoint
问题与此是正交的:队列行为也发生在异步调用中。
发布于 2010-09-21 13:46:50
很抱歉,我插上了一条旧线,但我认为上面所说的话可能是不正确的/误导的。
据我所知,.Timeout不是连接时间,而是整个HttpWebRequest和响应生命周期的总时间。证明:
我设定:
.Timeout=5000
.ReadWriteTimeout=32000
HttpWebRequest的连接和发布时间为26 for
但是随后的调用HttpWebRequest.GetResponse()以4974 of超时,从而证明5000 of是整个发送请求/获取响应集的时间限制。
我没有验证DNS名称解析是否是作为时间的一部分来测量的,因为这与我无关,因为这些都不是我真正需要的工作方式--我的目的是在连接到不接受连接的系统时更快地超时,就像它们在请求的连接阶段失败一样。
例如:对于有可能返回结果的连接请求,我愿意等待30秒,但我只想等待10秒,等待将请求发送到行为不正常的主机。
发布于 2010-01-28 00:33:55
来自HttpWebRequest.Timeout属性的文档:
域名系统(
)查询可能需要15秒才能返回或超时。如果请求包含需要解析的主机名,并且将超时设置为小于15秒的值,则可能需要15秒或更长时间才会引发WebException以指示请求的超时。
您的DNS查询是否可能是超时的原因?
https://stackoverflow.com/questions/1500955
复制相似问题