2012-09-20 14 views
5
コードの下片が エラーメッセージを与えている

: エラーSourse "操作がタイムアウトした":System.Net.httpWebRequest.GetResponse(AT)System.Net.WebRequest - タイムアウトエラー

これをメソッドは、URLを呼び出して応答オブジェクトを取得しています。

注:私はproduction..itに同じコードを送信するときにこれはすべて私のend..butで正常に動作しているが、時間ooutエラー

public GetUpdatedInventoryUnitValues(Vehicle aeVehicle) 
{ 
      WebRequest oWebRequest = null; 
      StringBuilder oStringBuilder = null; 
      StreamReader oStreamReader = null; 
      dcDealerDetails = new Dictionary<string, string>(); 

      MSRP = string.Empty; 
      NetPrice = string.Empty; 
      string strLine = string.Empty; 
      string strURL = GetUpdatedInventoryUnitValues.GetFormattedURL(aeVehicle); 

      try 
      { 
       /* Open the requested URL */ 
       oWebRequest = WebRequest.Create(strURL); 
       oWebRequest.Method = "GET"; 
       oWebRequest.ContentType = "application/xml"; 
       /* Get the stream from the returned web response */ 
       oStreamReader = new StreamReader(oWebRequest.GetResponse().GetResponseStream()); 
       /* Get the stream from the returned web response */ 
       oStringBuilder = new StringBuilder(); 
       /* Read the stream a line at a time and place each one into the stringbuilder */ 
       while ((strLine = oStreamReader.ReadLine()) != null) 
       { 
        /* Ignore blank lines */ 
        if (strLine.Length > 0) 
         oStringBuilder.Append(strLine); 
       } 

       string[] tempArray = null; 
       string[] tempNextArray = null; 
       //Split string by semicolon as a separater 
       tempArray = Data.SplitString(oStringBuilder.ToString(), new char[] { ';' }); 

       if (tempArray != null) 
       { 
        foreach (string invUnits in tempArray) 
        { 
         //Split string by '=' as a separater 
         tempNextArray = Data.SplitString(invUnits, new char[] { '=' }); 

         if (tempNextArray != null && tempNextArray.Length == 2) 
         { 
          switch (tempNextArray[0].ToLower()) 
          { 
           //case "msrp": 
           // MSRP = Data.RemoveDoubleCode(tempNextArray[1]); 
           // break; 
           case "netprice": 
            NetPrice = Data.RemoveDoubleCode(tempNextArray[1]); 
            break; 
          } 
         } 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       ErrorLog.ErrorMessage = ErrorLog.Separator; 
       ErrorLog.ErrorMessage = "Exception during posting data to another application ."; 
       ErrorLog.ErrorMessage = "ERROR MESSAGE : " + ex.Message; 
       ErrorLog.ErrorMessage = "ERROR SOURCE: " + ex.StackTrace.ToString(); 

      } 
      finally 
      { 
       if (oStreamReader != null) 
       { 
        oStreamReader.Close(); 
       } 
       if (oWebRequest != null) 
       { 
        oWebRequest = null; 
       } 
      } 
     } 

を示して私は何を間違っているのか、ないのです提案してください?

+0

はあなたの要求が良好であり、それは、コードの外にタイムアウトしていないあなたは確かにいますか?私はあなたのブラウザで直接起動しようとしましたか? –

+0

私の最終的にはうまくいっていますが、生産に同じコードを送ると、時間外れのエラーが表示されます –

+0

デベロッパープラットフォームとプロダクションプラットフォームの違いは何ですか?あなたの要求を止めるようなファイアウォールなどがありますか? –

答えて

17

最初の2つのリクエストは大丈夫ですが、、次にタイムアウトが始まることがありますか?もしそうなら、私はこれが問題である疑いがある:

oStreamReader = new StreamReader(oWebRequest.GetResponse().GetResponseStream()); 

あなたが応答を取得するが、それを処分することはありませんしています。あなたが使用する必要があります:あなたは全体usingステートメントを使用している場合

実際に ​​

を、あなたは完全にあなたのfinallyブロックを取り除くことができます。

これはかなり長い方法です - 77行! - それは実際にはコンストラクターズのようにして悪化し、それが見えます:

  • てみてくださいは、より小さく、より容易に理解、より簡単にテスト可能な塊にそれを分割する
  • はコンストラクタで多くの作業を行うことを避けるようにしてください
+0

..これは私の250の呼び出しでうまく動作しています。しかし、プロダクションではほぼすべてがタイムアウトしています。コード部分で...私はそれをやっています.. –

+0

@RatanSharma:プロダクションからどのURLをフェッチしていますか?本当にタイムアウトしている可能性はありますか? –

+0

上記の機能は、生産現場で実行されているツールからのものです...関数が応答を返すURLを呼び出しています..これは私のシステムでツールを実行するときにうまく動作しますが、私はそれがタイムアウトされている同じを実行しています.. –

1

私はpersonnally私のプログラムの一つのために、このコードを使用し、それが完璧に動作します:

WebRequest webRequest = WebRequest.Create(requestUri); 
    webRequest.Credentials = new NetworkCredential(login, password); 
    WebResponse webResponse = webRequest.GetResponse(); 
    Stream response = webResponse.GetResponseStream(); 
    StreamReader reader = new StreamReader(response); 

ので、私はそれはあなたのコードからではなく、本番のプラットフォームから来ないと思います。

+4

あなたが応答を破棄していないなら、それは完全には機能していません。あなたはただ運が良かっただけです。 –

+0

使用終了後に投稿コードを使用することにより、返信が破棄されますか? –

+1

はい。クリーンアップを確実にするために、 'IDisposable'を実装するものには' using'ステートメントを使うべきです。 –

2

経験を共有してください。

「操作のタイムアウト」と同じエラーが発生しました。

WebClientとWebRequestの両方を使用してみましたが(タイムアウトも設定しましたが)、まだエラーが発生していました。

理由は、回答を処理していないということでした。

ので、上述したように、私が使用:

using (var response = oWebRequest.GetResponse()) 

{ 
    ... 
} 

そして、それは問題を解決し...

関連する問題