【问题标题】:Timeout exception does not occur on time超时异常未按时发生
【发布时间】:2018-02-08 19:39:17
【问题描述】:

我使用 httpwebrequest(Timeout=2000) 和 webproxy 编写了以下代码
以下代码总是会因为错误的 url ("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; 
} 

【问题讨论】:

  • 似乎请求在您的尝试范围之外声明。因此其他参与者有可能改变超时吗?也许尝试在 try 范围内声明响应,看看效果如何。
  • 您是否考虑过切换到更现代的 HttpClient Api?您可以使用 CancellationTokens 以非常优雅的方式处理这些情况:msdn.microsoft.com/en-us/library/hh139115(v=vs.110).aspx
  • @SAm 感谢您的建议。正如建议的那样,我将 httpwebrequest 声明放在了 try 中。但是,问题仍然存在,但是谢谢
  • @CyprienAutexier 谢谢,我会按照你的建议去做。

标签: c# timeout httpwebrequest socketexception webproxy


【解决方案1】:

具有讽刺意味的是,在使用无效 url @987654321@ 进行测试期间,您无意中绊倒了地雷。有关详细信息,请参阅this post。该帖子中提到的 MSDN 文档是 here。请注意,WebRequest.Create 返回一个 HttpWebRequest。

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

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 2014-08-11
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多