超时异常不会按时发生

时间:2017-08-31 00:12:03

标签: c# timeout httpwebrequest socketexception webproxy

我使用httpwebrequest(Timeout = 2000)和webproxy
编写了以下代码 由于网址错误,以下代码始终会引发异常(“ww.google.com”

当我运行程序时,我会交替出现两种异常 1.远程服务器返回错误:(404)Not Found(Web Exception)
=>捕获此异常需要不到2000毫秒 =>这种异常处理是正常的 。
2。连接尝试失败,因为连接方在一段时间后没有正确响应或连接的主机无法响应(套接字例外)
=>捕获此异常需要25秒或更长时间
=>我设置了一个请求2000毫秒超时,但它不起作用!!!!

如果在2秒内没有响应,我想抓住异常
我该怎么办?

try 
{ 
       request = (HttpWebRequest)WebRequest.Create("https://ww.google.com"); 
       request.Proxy = proxy; 
       request.Method = "GET"; 
       request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"; 
       request.Timeout = 2000; 
       response = (HttpWebResponse)request.GetResponse(); 
       if ((response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Moved || response.StatusCode == HttpStatusCode.Redirect)) 
       { 
              StreamReader sreader = new StreamReader(response.GetResponseStream(), Encoding.Default); 
              gethtml = sreader.ReadToEnd(); 
              sreader.Close(); 
       } 
} 
catch (Exception ex) 
{ 
       throw ex; 
} 

1 个答案:

答案 0 :(得分:0)

讽刺的是,在使用无效网址https://ww.google.com进行测试时,您无意中绊倒了一个地雷。有关详细信息,请参阅this post。该帖子中提到的MSDN文档是here。请注意,WebRequest.Create会返回HttpWebRequest

基本上,它需要一段时间,因为网址没有映射到IP地址,因此不会被缓存在链中,每次向它发出请求时都需要完整的DNS查找。除非您在客户端使用自己的DNS缓存层,否则您无法对此做任何事情,但坦率地说它比它的价值更麻烦。