2012-02-04 5 views
2

HttpWebRequest가있는 서버에 연결하려고 시도했습니다. & HttpWebResponse 및 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() 메소드는 HttpWebRequest.GetResponse 메서드를 호출 할 때 발생합니다 그 WebException를 잡을 필요가 번 아웃 호출 할 때 . GetResponse() 메소드가 던질 수있는 네 가지 예외가 있으므로 throw되는 예외 유형을 확인하거나 필요한 특정 예외 유형 (예 : Catch (WebException ex) {})을 catch해야합니다.

참고로 WebRequest.Timeout 속성을 가져오고 설정할 수 있습니다. 코드는 HttpWebRequest.GetResponse() 메서드 호출과 Try-Catch 블록에서하는 GetResponse() 호출에 의해 노출 된 데이터와 관련된 모든 코드를 래핑 것에서

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

. 또한 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) : HttpRequest에 대한

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

자세한 내용은 찾을 수 here

+0

연결이 꺼져 있고 서버에 연결하려고하면 예외가 발생하지만 서버에 연결되어 있고 그 중 한 곳에서 내 무선을 끄지 않아도 예외는 발생하지 않습니다. ... 왜 그것이 작동하지 않는지 궁금 했어 !! – Ehsan

관련 문제