【问题标题】:request.timeout doesn't throw exceptionrequest.timeout 不会抛出异常
【发布时间】:2012-11-05 09:34:48
【问题描述】:
 Uri URL2 = new Uri(@"http://www......com");                      
 HttpWebRequest request2 = (HttpWebRequest)WebRequest.Create(URL2);
 request2.Timeout = 10000;  
 HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse();

我正在使用上面的代码进行 webrequest。当我写一个愚蠢的网址时,例如 www.oiasjdilasod.com 它会抛出异常;但是,当现有页面在几个小时内不可用时,我无法获得此异常。它不会抛出任何异常并停止运行。 当此页面不可用时,我在 Internet Explorer 上尝试过,它显示页面找不到 http 400 错误请求。 您对如何捕获此异常有什么建议吗?

【问题讨论】:

  • 请求没有超时,但是 - Web 服务器正在响应。它以 4XX 的 HttpStatus 响应,这表明来自客户端的请求存在错误。您的请求将超时的唯一情况是服务器已关闭、服务器不存在或服务器响应您的请求的时间过长。因此,您应该检查状态代码是否为 200(“Ok”)

标签: c# httpwebrequest timeout httpwebresponse timeoutexception


【解决方案1】:

您从服务器收到响应的事实意味着它可用,只是无法正常工作 - 因此发出请求并且不会因为服务器已响应而超时。

这只是 不是你想要的回应

相反,您应该检查StatusCode 属性。

 if(response2.StatusCode != HttpStatusCode.OK)
 {
      throw new Exception("Site is responding incorrectly!");
 }

【讨论】:

    【解决方案2】:

    我之前也遇到过同样的问题

    catch(WebException e) 
    {
     Console.WriteLine(e.toString()); 
    }
    

    会解决的

    【讨论】:

    • 感谢您的回答,但 webexception 并不能解决问题。正如我在页面关闭一段时间时提到的那样,webexception 不起作用。当您尝试一个实际上不存在的页面时,它会起作用。
    • @Oktay 我现在认为问题来自服务器而不是来自您的代码,所以如何通过设置超时请求来处理此问题,如果此时间超过特定时间,则显示页面已关闭的消息一段时间
    • 是的,我应该这样做,但我不知道该怎么做。秒表 stopWatch2 = new Stopwatch(); stopWatch2.Start(); HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse(); response2.Close(); stopWatch2.Stop();如果我尝试使用秒表,我无法设置超时值。你有更好的主意吗?
    • 您可以在 web.config 中设置此值。
    【解决方案3】:

    这段代码对我有用

    try
                {
                    Uri URL2 = new Uri(@"http://www.*****.com");
                    HttpWebRequest request2 = (HttpWebRequest)WebRequest.Create(URL2);
                    request2.Timeout = 100;
                    HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse();
                }
                catch (WebException e)
                {
                    MessageBox.Show(e.Message.ToString());
                }
    

    【讨论】:

      【解决方案4】:

      你抛出什么异常?常规异常不行,它必须是 WebException。

      ...
      catch(WebException e) 
      {
       Console.WriteLine("Error: "+ e.Status); 
      }
      

      编辑:

      超时异常(连同 WebException)怎么样?

      catch (TimeoutException e)
      {
       Console.WriteLine(e);
      }
      catch(WebException e) 
      {
       Console.WriteLine("Error: "+ e.Status); 
      }
      

      【讨论】:

      • 是的,我正在抛出 webexception,但关键是如果我不添加任何异常以查看当时的异常是什么。它运行时不会抛出任何异常。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 2012-04-08
      • 1970-01-01
      相关资源
      最近更新 更多