2012-02-04 66 views
2

我试图用HttpWebRequest连接服务器& HttpWebResponse它工作正常,但我有另一个问题,我想知道什么时候服务器超时或断开连接,假设发生了一些事情,我的连接和我断开了,我想知道我怎么能明白这一点在下面的代码:HttpWebRequest&HttpWebResponse问题

string uri = @"myUrl"; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
     request.Credentials = new NetworkCredential(User, Pass); 
     ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); 
     byte[] buf = new byte[10000]; 
     int count = -1; 
     String read = ""; 
     HttpWebResponse response; 
     //MessageBox.Show("OK"); 
     //response = (HttpWebResponse)request.GetResponse(); 
     //count = response.GetResponseStream().Read(buf, 0, buf.Length); 
     //read = Encoding.UTF8.GetString(buf, 0, count); 
     //MessageBox.Show(read + "SALAM"); 
     //while (true) 
     //{ 
     response = (HttpWebResponse)request.GetResponse(); 
     //while (true) 
     //{ 
     do 
     { 
      count = response.GetResponseStream().Read(buf, 0, buf.Length); 
      read += Encoding.UTF8.GetString(buf, 0, count); 
     } while (response.GetResponseStream().CanRead && count != 0); 

     if (read != "") 
     { 
      // MessageBox.Show(read); 
      XDocument xdoc = XDocument.Parse(read); 

      //Filter EventXML 
      var lv1s = from lv1 in xdoc.Descendants("event") 
         select new 
         { 
          Event_id = lv1.Attribute("id").Value, 
          Header = lv1.Attribute("name").Value, 
          Children = lv1.Descendants("argument") 
         }; 
      List<event_details> event_detail = new List<event_details>(); 


      foreach (var lv1 in lv1s) 
      { 
       if (lv1.Event_id == event_id) 
        foreach (var lv2 in lv1.Children) 
        { 
         event_details x = new event_details(); 
         x.type = lv2.Attribute("type").Value; 
         x.value = lv2.Attribute("value").Value; 
         event_detail.Add(x); 
        } 
      } 
      //inja chun ke daram rooye MsgDGV ke ye k Datagridview minevisam bayad hatman az Invoke estefade konam 
      // ta kharabkari nashe:P:D 
      Point detail_point = new Point(); 
      detail_point.X = MsgDGV.Width/2 + (this.Width - MsgDGV.Width)/2; 
      detail_point.Y = MsgDGV.Height/2 + (this.Height - MsgDGV.Height)/2; 
      Details detail = new Details(event_detail, timestamp, EVENT, detail_point); 
      detail.ShowDialog(); 
      event_details.Abort(); 
     } 

回答

1

其实我找到了方法!!上面的两个答案工作正常,当你从互联网断开连接,或者你的连接出现问题时,它会抛出一个异常,并用上面指定的方式,我们可以解决它,但是当你连接并且在连接中断时,情况改变了。既然您已连接,并到达:

response.GetResponseStream().Read(buf, 0, buf.Length); 

然后,它会停留在该功能则读取所以C#得到这个你应该指定一个超时:

response.GetResponseStream().ReadTimeout = 1000; 

所以之前读你应该指定一个超时,然后一切正常;

1

当Request.GetResponse()方法调用超时,你需要抓住WebException被抛出时,HttpWebRequest.GetResponse方法被调用。 GetResponse()方法可能会抛出四个异常,因此您需要检查抛出的异常类型或捕获您需要的特定异常类型:Catch(WebException ex){}。

请注意,您可以根据需要获取并设置WebRequest.Timeout属性。

// Set the 'Timeout' property in Milliseconds. 
request.Timeout = 10000; 

在你的代码将包裹HttpWebRequest.GetResponse()方法调用,并与由在Try-Catch块的GetResponse()调用程序公开的数据全部代码。 您还应该利用WebResponse实现IDisposable并使用using syntax管理对象作用域和生命周期的事实,以便不会再引用不再需要的对象或范围。

try 
{ 
    using (WebResponse response = request.GetResponse()) 
    { 
      // ALL OTHER CODE 
    } 
} 
catch (Exception ex) 
{ 
    // Handle Exception 
} 
+0

这是工作正常,当我的连接关闭,并尝试连接到服务器,然后将引发异常,但是当我已连接到服务器,并在中间,我关闭我的无线没有任何例外正在投掷...我很奇怪它为什么不起作用! – Ehsan 2012-02-04 14:13:47

0

你能赶上WebException,看看错误请求执行或超时期限的请求期间已发生过期:

try 
{ 
    using(var response = (HttpWebResponse)request.GetResponse()) 
    { 

    } 
} 
catch(WebException e) 
{ 
    //timeout or error during execution 
} 

你也可能需要检查响应的状态等于200 :

if(resp.StatusCode == 200) 
{ 
    //code 
} 

更多关于HttpRequest的详细信息,你可以找到here

+0

这工作正常,当我的连接关闭,并尝试连接到服务器,然后异常将被抛出,但是当我已经连接到服务器,并在中间,我关闭我的无线没有例外抛出...我很奇怪它为什么不工作! – Ehsan 2012-02-04 14:16:03