2012-03-05 2 views
0

Я использую следующую функцию для навигации по URL-адресам в моем коде winform C#.C# HttpWebRequest IOException

Я думаю, что код хорошо, но когда он пытается установить соединение по адресу URL, он терпит неудачу и бросает ошибку IOException:

Мой вопрос:

Как я могу добавить проверить код, чтобы убедиться, что соединение с URL-адресом успешно выполнено, а если нет, то он повторит попытку, пока не сделает успешное соединение?

public String WebRequestNavigate(string url) 
     { 
      StringBuilder sb = new StringBuilder(); 
      byte[] buf = new byte[8192]; 

      if (url != "") 
      { 
       HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url); 
       myReq.KeepAlive = false; 
       try 
       { 
        HttpWebResponse resp = (HttpWebResponse)myReq.GetResponse(); 
        Stream stream = resp.GetResponseStream(); 

        String test = ""; 
        int count = 0; 
        do 
        { 

         **count = stream.Read(buf, 0, buf.Length);** 

         if (count != 0) 
         { 
          test = Encoding.UTF8.GetString(buf, 0, count); 
          sb.Append(test); 
         } 
        } 
        while (count > 0); 
        stream.Close(); 
       } 
       catch (WebException ex) 
       { 

       } 


      } 


      return sb.ToString(); 
     } 

Спасибо, друзья, за все ваши ответы. Они все правильные. Однако я, наконец, нашел свою ошибку и исправил ее.

Проблема в том, что я пытался поймать WebException, однако, я получал сообщение об ошибке IOException.

Я изменил WebException, как IOException и исправить мой код следующим образом:

catch (IOException ex) 
        { 
         System.Threading.Thread.Sleep(500);      
         myReq = (HttpWebRequest)WebRequest.Create(url); 
         myReq.KeepAlive = false; 
        } 

Я использовал ваше предложение для Thread.Sleep, чтобы сделать мой код подождать, прежде чем новое соединение URL. Это решило мою проблему% 100.

Извините за то, что вы нашли время, но вы мне очень помогли и предоставили прозрение. Благодаря!

+0

Могу ли я спросить, к какому URL-адресу вы пытаетесь подключиться? – f2lollpll

+0

URL-адреса различаются. Не один URL-адрес, если вы имели в виду это. –

ответ

1

Некоторые вещи похожи, но проще:

Stream stream = null; 

while (stream == null) 
{ 
    try 
    { 
     HttpWebResponse resp = (HttpWebResponse)myReq.GetResponse(); 
     stream = resp.GetResponseStream(); 
    } 
    catch (Exception e) 
    { 
     System.Threading.Thread.Sleep(500); 

     // plus idea: die after a few try? 
    } 
} 
2

Простейший (но не обязательно «лучший») способ сделать это - это обернуть его в цикл while и создать переменную booleans, которая подтверждает, будет ли соединение выполнено. Если это не удастся, то ConnectionSucceeded никогда не будет установлен в true.

public String WebRequestNavigate(string url) 
     { 
      StringBuilder sb = new StringBuilder(); 
      byte[] buf = new byte[8192]; 

      if (url != "") 
      { 
       bool ConnectionSucceeded; 
       while (!ConnectionSucceeded) { 
        HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url); 
        myReq.KeepAlive = false; 
        try 
        { 
         HttpWebResponse resp = (HttpWebResponse)myReq.GetResponse(); 
         Stream stream = resp.GetResponseStream(); 

         String test = ""; 
         int count = 0; 
         do 
         { 

          count = stream.Read(buf, 0, buf.Length); 

          if (count != 0) 
          { 
           test = Encoding.UTF8.GetString(buf, 0, count); 
           sb.Append(test); 
          } 
         } 
         while (count > 0); 
         stream.Close(); 
         ConnectionSucceeded = true; 
        } 
        catch (WebException ex) 
        { 

        } 

       } 
      } 


      return sb.ToString(); 
     } 
0

Мое предложение было бы использовать WebClient в манере, подобной этой:

string result = ""; 
bool success = false; 
int remainingAttempts = 5; 

while(success == false && remainingAttempts > 0) { 

    remainingAttempts--; 

    try 
    { 
     WebClient client = new WebClient(); 
     result = client.DownloadString(url); 
     success = true; 
    } 
    catch (WebException ex) 
    { 
    } 

    if(success == false) { 
     System.Threading.Thread.Sleep(1000); 
    } 

} 

Заканчивать http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx и http://msdn.microsoft.com/en-us/library/system.net.webexception.aspx для справки ,

+0

Проблема с 'WebClient' заключается в том, что она не обеспечивает те же функции, что и' HttpWebRequest'. Они не являются взаимозаменяемыми, в зависимости от того, чего пытается достичь ОП. –

+0

Я согласен, что они не взаимозаменяемы, и это, безусловно, стоит упомянуть. Однако, основываясь на его образце кода, кажется, он хочет получить строковое представление содержимого, найденного в URL-адресе. – tstuts