2012-09-20 34 views
5

Poniższy fragment kodu daje komunikat o błędzie: "Operacja upłynął limit czasu" Błąd sourse: co System.Net.httpWebRequest.GetResponse()System.Net.WebRequest - Timeout error

ten metoda wywołuje adres URL i pobiera obiekt odpowiedzi.

UWAGA: To wszystko jest w porządku pracy w moim end..but kiedy wysłać ten sam kod do production..it pokazuje czas oout błędy

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; 
       } 
      } 
     } 

Proszę zasugerować co robię źle lub brakuje?

+0

Czy na pewno twoja prośba jest dobra i nie ma limitu czasu z kodem? Czy próbowałeś uruchomić go bezpośrednio w przeglądarce? –

+0

Wszystko działa dobrze w moim końcem ... ale kiedy wysyłam ten sam kod do produkcji..it pokazuje czas na błędy –

+0

Jakie są różnice między twoją platformą developpement a twoją platformą produkcyjną? Czy jest jakaś zapora ogniowa lub coś podobnego, co może powstrzymać twoją prośbę? –

Odpowiedz

17

Być może odkrywasz, że pierwsza para próśb jest w porządku, a , a następnie zaczynają limit czasu? Jeśli tak, podejrzewam, że to jest problem:

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

Przywołujesz odpowiedź, ale nigdy jej nie pozbywasz. Należy użyć:

using (var response = oWebRequest.GetResponse()) 
{ 
    ... 
} 

W rzeczywistości, można pozbyć się bloku finally całkowicie jeśli używasz using oświadczenia całym.

Na marginesie, jest to dość długa metoda - 77 linii! - a co gorsza, wygląda na to, że to rzeczywiście konstruktor:

  • spróbuj podzielić go na mniejsze, łatwiejsze do zrozumienia, łatwiej testowalnych kawałkami
  • Staraj się unikać robi dużo pracy w konstruktorów
+0

.. To działa dobrze z moimi 250 połączeniami w pętli .. ale w produkcji jego prawie wszystkie są przekroczenia czasu.Na części kodu .. tak powinienem to robić .. –

+0

@RatanSharma: Jaki adres URL pobieracie z produkcji? Czy to możliwe, że jest to tylko limit czasu? –

+0

Powyższa funkcja pochodzi z narzędzia, które jest uruchomione w miejscu produkcji ... funkcja wywołuje adres URL, który daje pewną odpowiedź. Działa to dobrze, gdy uruchamiam narzędzie w moim systemie, ale w serwerze produkcyjnym, gdy Używam tego samego czasu, który przestał działać. –

1

i personnally użyć tego kodu do jednego z mojego programu i działa idealnie:

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

więc myślę, że nie pochodzi z Twojego kodu, ale z platformy produkcyjnej.

+4

Jeśli nie pozbywasz się odpowiedzi, to nie działa idealnie - po prostu masz szczęście. –

+0

Korzystając z opublikowanego kodu po zakończeniu używania, pozbędziesz się odpowiedzi? –

+1

Tak. Powinieneś używać instrukcji 'using' dla prawie wszystkiego, co implementuje' IDisposable', aby zapewnić czyszczenie. –

2

Po prostu dzielenie się doświadczeniem.

Otrzymałem ten sam błąd "Operacja przekroczona czas".

Próbowałem używać zarówno WebClient, jak i WebRequest (również ustawiono limit czasu), ale wciąż pojawiał się błąd.

Powód był taki, że nie dysponuję odpowiedzią.

Więc użyłem jak wspomniano powyżej:

using (var response = oWebRequest.GetResponse()) 

{ 
    ... 
} 

I to rozwiązało problem ...