2011-07-07 8 views
7

Tiene un problema, donde se cuelga y finaliza la llamada WebRequest.GetResponse() en la primera llamada, pero después de la primera llamada, todo funciona bien.¿Por qué WebRequest expira siempre en la primera solicitud, pero nunca en las siguientes

 try { 
      WebRequest myHttpWebRequest = WebRequest.Create(@"http://192.168.x.x/"); 
      // Sends the HttpWebRequest and waits for the response.   
      myHttpWebRequest.Timeout = 1000; 
      WebResponse myHttpWebResponse = myHttpWebRequest.GetResponse(); 
     } catch(Exception e) { 
      Console.WriteLine("Failure 1"); 
     } 
     try { 
      WebRequest myHttpWebRequest = WebRequest.Create(@"http://192.168.x.x/"); 
      // Sends the HttpWebRequest and waits for the response.   
      myHttpWebRequest.Timeout = 1000; 
      WebResponse myHttpWebResponse = myHttpWebRequest.GetResponse(); 
     } catch(Exception e) { 
      Console.WriteLine("Failure 2"); 
     } 
     try { 
      WebRequest myHttpWebRequest = WebRequest.Create(@"http://192.168.x.x/"); 
      // Sends the HttpWebRequest and waits for the response.   
      myHttpWebRequest.Timeout = 1000; 
      WebResponse myHttpWebResponse = myHttpWebRequest.GetResponse(); 
     } catch(Exception e) { 
      Console.WriteLine("Failure 3"); 
     } 

utilizando este código en una aplicación de consola, siempre recibo un Failure 1. Corriendo bajo el depurador o no. He hecho un loop , y siempre falla en el primero, nunca en otros. De hecho, al leer los registros del servidor web, en realidad nunca recibe la primera solicitud. ¿Me estoy perdiendo de algo?

+0

¿Alguna vez obtuvo la solución para este problema? –

+1

Sí, fue el resultado de tener una VPN en ejecución. Al apagar el software VPN o VPN, se solucionó el problema. – Rahly

Respuesta

9

EDIT: me he dado cuenta de que la respuesta a continuación encajaría con la situación exactamente opuesta, donde la primera solicitud funciona pero los otros no. Sin embargo, sigue siendo importante: usted realmente debería deshacerse de sus respuestas. También sería útil si cuando informa el error, también informa el mensaje de excepción ...

Para resolver lo que está sucediendo aquí, realmente debería usar algo como WireShark para que pueda ver si el problema es que el se hace una solicitud pero no se responde, o si ni siquiera se está haciendo.

Me pregunto si el problema es en realidad que se está resolviendo un proxy, o algo así ... y no hay casi tiempo suficiente para resolverlo antes de las segunda vez solicitud fuera. Intente aumentar los tiempos de espera. De nuevo, esto debería ser visible a través de WireShark.


Usted no está disponiendo de la respuesta de la web, por lo que el conjunto de conexiones para la segunda solicitud va a agotar el tiempo de espera para conseguir que la conexión de nuevo.

poner la parte WebResponse en un comunicado using y es probable que lo encontrará todo funciona bien:

using (WebResponse myHttpWebResponse = myHttpWebRequest.GetResponse()) 
{ 
} 

Eso suponiendo que le hace realmente algo con la respuesta, por supuesto. De lo contrario, usted podría escribir:

myHttpWebRequest.GetResponse().Dispose(); 

:)

+0

Pero no es la segunda solicitud que estoy recibiendo el tiempo de espera, de hecho, el segundo funciona perfectamente bien. El primero es el tiempo de espera. Pero, hice el cambio como dijiste, e hice el uso (esta es solo una prueba, no una aplicación real, aún), y no hizo ninguna diferencia. La primera solicitud aún está expirando. – Rahly

+0

@Jeremy: Sí, me acabo de dar cuenta de eso. ¿El sitio web está activo antes de la primera solicitud? –

+0

Sí reporté la excepción, es un tiempo de espera – Rahly

0

Usted puede obtener un comportamiento muy similar a esto si usted no ha purgado \ cerró la RequestStream antes de pedir la respuesta. Este comportamiento parece existir en .NET 3.5 pero se ha tratado en .NET Framework 4.5. Me di cuenta del problema al cambiar los marcos: el código (sin el cierre) que funcionaba en 4.5 dejó de funcionar cuando se compiló en 3.5. Tal vez intente obtener explícitamente el RequestStream y cerrarlo como una solución alternativa.

+0

Eso es más o menos lo que John explicó, y no veo el cierre de una transmisión como una "solución alternativa", sino más como un "debe hacer". – ForceMagic

3

Puede ser un poco tarde, pero tuve exactamente el mismo efecto. La razón finalmente fue que no ha habido una puerta de enlace predeterminada en la red. La solución fue establecer optativamente la solicitud .Proxy = null.

var request = WebRequest.Create(UriString); 
request.Timeout = Timeout; 
if (_disableProxy) 
{ 
    request.Proxy = null; 
} 
if (request is HttpWebRequest) 
{ 
    var response = (HttpWebResponse)request.GetResponse(); 
    responseStream = response.GetResponseStream(); 

} 
if (request is FtpWebRequest) 
{ 
    var response = (FtpWebResponse)request.GetResponse(); 
    responseStream = response.GetResponseStream(); 
} 
else if (request is FileWebRequest) 
{ 
    var response = (FileWebResponse)request.GetResponse(); 
    responseStream = response.GetResponseStream(); 
} 

Espero que esto ayude.

0

He encontrado el mismo problema, en mi caso he aumentado el valor timeout del objeto WebRequest y funcionó!

webRequest.Timeout = int.Parse(60000); 

(He configurado la propiedad de tiempo de espera en 60 segundos).

+1

Suena más como un problema de tiempo de espera ... tuve un tiempo de espera establecido en 3600000 y lo detuve después de 12 minutos ... – Rahly

+0

3600000 es bastante enorme, –

+0

Estaba probando en ese momento – Rahly

Cuestiones relacionadas