2012-09-20 15 views
5

La pieza debajo de código está dando mensaje de error: "La operación ha agotado el tiempo" Sourse de error: en System.Net.httpWebRequest.GetResponse()System.Net.WebRequest - Tiempo de espera de error

Este método llama a una URL y busca el objeto de respuesta.

NOTA: Esto es todo lo que trabaja muy bien en mi end..but cuando envío el mismo código para production..it muestra de tiempo oout errores

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

Para sugerir lo que estoy haciendo mal o que falta?

+0

¿Seguro de su solicitud es buena y no de tiempo de espera del código? Quiero decir, ¿has intentado ejecutarlo directamente en tu navegador? –

+0

Todo funciona bien en mi extremo ... pero cuando envío el mismo código a producción ... muestra el tiempo sin errores –

+0

¿Cuáles son las diferencias entre su plataforma de desarrollo y su plataforma de producción? ¿Hay algún firewall o algo así que podría detener su solicitud? –

Respuesta

17

¿Es posible que encuentre que las primeras dos solicitudes son correctas, y luego comienzan el tiempo de espera? Si es así, sospecho que este es el problema:

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

Está buscando la respuesta, pero nunca se deshace de ella. Deberá utilizar:

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

De hecho, usted puede deshacerse de su bloque finally por completo si se utiliza a lo largo de using declaraciones.

Como un lado, este es un método bastante largo - ¡77 líneas! - y peor, parece que en realidad es un constructor:

  • Trata de dividir a cabo en más fácilmente entendidas, trozos comprobables más pequeños, más fácilmente
  • Trate de evitar hacer mucho trabajo en los constructores
+0

.. Esto funciona bien con mis 250 llamadas en bucle ... pero en producción, casi todos son tiempos de espera ... En la parte del código ... si, debería hacerlo ... –

+0

@RatanSharma: ¿Qué URL está obteniendo de la producción? ¿Es posible que realmente se acabe el tiempo de espera? –

+0

La función anterior es de la herramienta ... que se ejecuta en el sitio de producción ... la función llama a una URL que está dando alguna respuesta ... Esto funciona bien cuando ejecuto la herramienta en mi sistema, pero en el servidor de producción cuando Estoy ejecutando lo mismo que está reduciendo .. –

1

personalmente utilizo este código para uno de mi programa y funciona perfecto:

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

así que creo que no viene de su código, pero desde su plataforma de producción.

+4

Si no se está deshaciendo de las respuestas, entonces no está funcionando a la perfección, solo tiene suerte. –

+0

Al usar el código publicado después del final del uso, ¿elimina la respuesta? –

+1

Sí. Deberías usar declaraciones 'using' para casi cualquier cosa que implemente' IDisposable', para asegurar la limpieza. –

2

Solo compartiendo experiencia.

Me estaba saliendo el mismo error "Tiempo de espera de la operación".

He intentado utilizar tanto WebClient como WebRequest (también establecí el tiempo de espera), pero seguía recibiendo el error.

La razón fue que no descartaba la respuesta.

así que utilicé como se mencionó anteriormente:

using (var response = oWebRequest.GetResponse()) 

{ 
    ... 
} 

Y es resuelto el problema ...

Cuestiones relacionadas