2017-08-31 88 views
1

不会发生我写的使用(超时= 2000)下面的代码HttpWebRequest和webproxy
下面的代码总是会抛出一个异常,因为错误的URL(“ww.google.com”超时异常及时

当运行该程序,我得到2种例外的交替
1.远程服务器返回错误:(404)未找到(网页异常)
=>这需要小于2000毫秒捕获此异常
=>这个异常处理是正常的。

2.连接尝试失败,因为连接的方没有正确一段时间后响应或连接的主机未能响应(插座除外)
=>它需要25秒钟或更长时间,以赶上这个异常
=>我设置了一个请求2000ms超时但它不起作用!

我想捕捉异常,如果有是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; 
} 
+0

看起来好像请求是在您的尝试范围之外声明的。因此其他演员有可能改变超时时间吗?也许尝试在try范围内声明响应,看看它是如何发生的。 – SAm

+0

你有没有考虑切换到更现代的HttpClient Api?您可以使用CancellationTokens以非常优雅的方式处理这些案例:https://msdn.microsoft.com/zh-CN/library/hh139115(v=vs.110).aspx –

+0

@SAm感谢您的建议。正如所建议的,我把httpwebrequest声明放在一个try中。但是,问题仍然存在,但是谢谢 –

回答

0

讽刺与无效的网址https://ww.google.com测试期间您无意中绊倒了地雷。详情请参阅this post。该帖子中提到的MSDN文档是here。请注意,WebRequest.Create返回HttpWebRequest

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