WebRequest.Timeout无法按预期工作

var strURL = "http://999.999.999.999"; // invalid IP-address System.Net.WebResponse objResponse = default(System.Net.WebResponse); System.Net.WebRequest objRequest = default(System.Net.WebRequest); objRequest = System.Net.HttpWebRequest.Create(strURL); objRequest.Timeout = 100; objResponse = objRequest.GetResponse(); System.IO.StreamReader sr = new System.IO.StreamReader(objResponse.GetResponseStream()); result = sr.ReadToEnd(); 

我通过firebug看到的超时是3000毫秒……不应该那样!

您的问题在于无效IP地址的请求前解析。 所有正常请求都正常超时。 根据MSDN:

域名系统(DNS)查询最多可能需要15秒才能返回或超时。 如果您的请求包含需要解析的主机名,并且您将Timeout设置为小于15秒的值,则在抛出WebException之前可能需要15秒或更长时间才能指示请求超时。

是的,’999.999.999.999’不需要DNS查找,但Request对象必须混淆并花一些时间来解决它。 如果IP更改为有效的URL:

 var strURL = "http://www.myjunkinvalidurl.com"; 

或有效的,有效的IP:

 var strURL = "http://134.170.188.221"; // microsoft.com 

或有效的,无法运作的IP:

 var strURL = "http://123.123.123.123"; 

所有这些都在大约115毫秒内(超时100毫秒)回来,所以WebRequest的IP地址解析无效,这对我来说大约需要2300毫秒。 保持IP有效,你应该没事。

根据http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.timeout.aspx请求超时之前等待的毫秒数。 默认值为100,000毫秒(100秒)。

timeout属性设置为毫秒。 通过设置为“100”,您的超时设置为0.1秒(100毫秒)。 尝试设置更合理的东西,例如30秒(30,000毫秒),或者只是不明确设置并保留为默认的100,000毫秒。

来自MSDN