2012-03-05 10 views
0

次の関数を使用して、C#winformコードのURLアドレスに移動しています。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を受け取りました。

私はIOExceptionがようWebExceptionを変更し、次のように私のコードを修正:

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

私は新しいURLに接続を試みる前に、私のコードを待機させるためにはのThread.sleepのためのあなたの提案を使用していました。これは私の問題%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ループでラップし、接続が成功したかどうかを確認するブール変数を作成することです。成功しない場合、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

私の提案は、これと同様の方法でWebクライアントを使用するために、次のようになります。

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.aspxhttp://msdn.microsoft.com/en-us/library/system.net.webexception.aspxをチェック。

+0

'WebClient'の問題は' HttpWebRequest'と同じ機能を提供しないことです。彼らは、OPが達成しようとしていることに応じて、実際に交換可能ではありません。 –

+0

私は彼らが交換できないことに同意します、そして、これは確かに言及する価値があります。しかし、彼のコードサンプルに基づいて、urlで見つかったコンテンツの文字列表現が必要なようです。 – tstuts