我相信长期的研究和搜索之后,我发现,我想要做的可能是更好的通过建立异步连接和所需超时后终止其服务......但我会继续和问问反正!
的代码快速片段:
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
方法是在多线程应用程序,其中我连接到大量公司的网络服务器。 在服务器没有响应的情况下, HttpWebRequest.GetResponse()
正在约20秒超时,即使我指定的只有5秒的超时。 在通过定期间隔服务器获得的利益,我想跳过那些服用时间超过5秒的连接。
所以,问题是:“有没有指定/减小了的WebRequest或连接超时HttpWebRequest的一个简单的方法?”
我认为 ,问题是, WebRequest
措施后,才要求实际上是由时间。 如果您提交多个请求相同的地址,则ServicePointManager
会扼杀你的请求,实际上仅提交多并发连接作为相应的值ServicePoint.ConnectionLimit
在默认情况下会从价值ServicePointManager.DefaultConnectionLimit
。 应用CLR主机将其设置为2,ASP主机10.因此,如果你有一个多线程的应用程序提交多个请求在同一主机只有两个真正被放置在电线上,其余的都排队。
我还没有研究这一个确凿的证据,这是否是真正发生的事情,但在一个类似的项目我有东西是可怕的,直到我删除了ServicePoint
限制。
另一个需要考虑的因素是DNS查找时间。 同样,我相信没有确凿的证据支持,但我认为WebRequest
不计入请求超时的DNS查找时间。 DNS查找时间显示为一些部署非常大的时间因素。
是的,你必须编写围绕您的应用程序WebRequest.BeginGetRequestStream
(用于POST
s的内容)和WebRequest.BeginGetResponse
(用于GET
S 和 POSTS
S)。 同步调用不能扩展(我不会进入细节的原因,但我确实有确凿的证据)。 反正ServicePoint
问题是正交的:排队行为发生与异步调用了。
对不起用于定位到一个古老的线程,但我认为这在过去是上面说的可能不正确/误导。
从我可以告诉.Timeout是不是连接时间,这是允许的HttpWebRequest和响应的整个生命周期的总时间。 证明:
我设置:
.Timeout=5000
.ReadWriteTimeout=32000
该连接和后期时间的HttpWebRequest了26ms
但后续调用HttpWebRequest.GetResponse()在4974ms超时由此证明5000毫秒是整个发送请求/响应得到设定呼叫的时间限制。
如果DNS域名解析被作为,因为这是不相干的我,因为没有这部分时间测得我没有验证的作品我真的需要它的工作方式 - 我的意思是连接到系统时,以更快的时间指出,如图他们在请求的连接阶段失败的未接受连接。
例如:我愿意等待30秒,在具有返回结果的机会的连接请求,但我只想烧10秒等待发送到出现异常的主机的请求。
这是我后来这有助于发现是.ReadWriteTimeout
财产。 这一点,除了.Timeout
属性似乎终于削减时间线将花费试图从有问题的服务器下载。 默认时间.ReadWriteTimeout
为5分钟,这对于我的应用程序是太长了。
所以,在我看来:
.Timeout
=时间花在试图建立连接(不包括查找时间) .ReadWriteTimeout
=花费的时间试图读取或写入数据连接建立后
更多信息: HttpWebRequest.ReadWriteTimeout物业
编辑:
每@ KyleM的评论中, Timeout
属性是整个连接尝试,并在MSDN上阅读了说明:
超时是毫秒数,与GetResponse的方法制造的后续同步请求等待响应,而GetRequestStream方法等待流。 超时适用于整个请求和响应,而不是单独地向GetRequestStream和GetResponse的方法调用。 如果资源未在超时时间内返回,请求抛出设置为WebExceptionStatus.Timeout Status属性引发WebException。
(重点煤矿。)
从HttpWebRequest.Timeout属性的文件:
域名系统(DNS)查询可能需要长达15秒返回或超时。 如果您的请求包含要求分辨率的主机名和你设置的超时值小于15秒,被抛出引发WebException前,表示对您的请求超时,可能需要15秒以上。
有没有可能是你的DNS查询超时的原因是什么?
不管是什么,我们尝试我们不能设法得到低于21秒超时,当我们检查服务器下跌。
要解决此我们结合一个TcpClient的检查,看看是否域还活着,随后由独立的检查,以查看该网址是活跃的
public static bool IsUrlAlive(string aUrl, int aTimeoutSeconds)
{
try
{
//check the domain first
if (IsDomainAlive(new Uri(aUrl).Host, aTimeoutSeconds))
{
//only now check the url itself
var request = System.Net.WebRequest.Create(aUrl);
request.Method = "HEAD";
request.Timeout = aTimeoutSeconds * 1000;
var response = (HttpWebResponse)request.GetResponse();
return response.StatusCode == HttpStatusCode.OK;
}
}
catch
{
}
return false;
}
private static bool IsDomainAlive(string aDomain, int aTimeoutSeconds)
{
try
{
using (TcpClient client = new TcpClient())
{
var result = client.BeginConnect(aDomain, 80, null, null);
var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(aTimeoutSeconds));
if (!success)
{
return false;
}
// we have connected
client.EndConnect(result);
return true;
}
}
catch
{
}
return false;
}