2012-02-04 5 views
2

Я попытался подключиться к серверу с HttpWebRequest & HttpWebResponse, и он отлично работает, но у меня возникла еще одна проблема, которую я хочу знать, когда сервер был отключен или отключен, предположим, что что-то случилось с моим подключением и Я отсоединился Я хочу знать, как я могу понять это в следующем коде:HttpWebRequest & HttpWebResponse issues

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() может выдавать, поэтому вам нужно либо проверить тип Exception, либо загрузить конкретное исключение. Тип, который вам нужен, например: Catch (WebException ex) {}.

Обратите внимание, что вы можете получить и установить свойство WebRequest.Timeout по мере необходимости.

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

В своем коде вы бы обернуть вызов метода HttpWebRequest.GetResponse() и весь код, относящуюся к данным, раскрываемых вызов GetResponse() в Try-Catch блоке. Вы также должны воспользоваться тем фактом, что WebResponse реализует IDisposable и использует using syntax для управления областью и временем объекта, поэтому вам не нужно ссылаться на объекты, которые больше не требуются или в области видимости.

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

Это нормально работает, когда мое соединение отключено и пытается подключиться к серверу, тогда исключение будет исключено, но когда я подключусь к серверу, и в середине этого я отключу свое беспроводное исключение бросает ... Мне было интересно, почему он не работает! – Ehsan

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