2010-02-12 20 views
9

Después de buscar en Google por un par de días, realmente no puedo resolver el problema descrito. Espero que aquí encuentre una soluciónGetRequestStream arroja la excepción Timeout al azar

Estoy usando un código adjunto cuando llamo al servicio WCF en el mismo servidor. Me sale error de tiempo de espera de forma aleatoria en WebReq.GetRequestStream llamada()

Cuando estoy cheque netstat veo que la conexión permanece abierta, por lo que probablemente no es un problema, pero no sé cómo resolverlo

 //request inicialization 
     HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url); 
     WebReq.Method = "POST"; 
     WebReq.ContentType = "application/json; charset=utf-8"; 
     WebReq.ContentLength = buffer.Length; 

     WebReq.Proxy = null; 
     WebReq.KeepAlive = false; //also tried with true 
     WebReq.AllowWriteStreamBuffering = false; //also tried with true 

     //this produces an error 
     using (Stream PostData = WebReq.GetRequestStream()) 
     { 
      PostData.Write(buffer, 0, buffer.Length); 
      PostData.Close(); 
     } 

     //open and read response 
     HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 
     Stream Answer = WebResp.GetResponseStream(); 
     StreamReader _Answer = new StreamReader(Answer); 

     WebResp.Close(); 

     //return string 
     return _Answer.ReadToEnd(); 

El tiempo de espera se produce principalmente después de unos 10 segundos de tiempo de inactividad, pero también después de cinco o más solicitudes en la fila. Realmente no puedo encontrar un patrón.

¿Qué podría estar mal con este código? ¿Hay alguna otra (mejor) forma de llamar al servicio WCF?

Respuesta

12

No sé si definitivamente es el responsable del problema, pero solo está cerrando la respuesta web si no arroja una excepción y nunca cierra el flujo de respuesta. Utilice using declaraciones:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    return reader.ReadToEnd(); 
} 

Esto bien podría explicar el problema, ya que si se deja una respuesta abrirlo mantendrá la conexión con el servidor web de código abierto - lo que significa la agrupación de conexiones a continuación, no puede utilizar esa conexión.

+0

Es un poco mejor, pero todavía tengo tiempos de espera. Entonces, es realmente extraño. Entonces, después del primer enlace, haga clic en Cargando y cargando, y si en ese momento hace clic en el mismo o en cualquier otro enlace en la página, la página se carga en el segundo o más. Entonces, hay algo mal con la creación de la conexión. Como supongo – AnzeR

+0

, no me di cuenta de que estaba en la misma máquina ... Me pregunto si te estás quedando sin subprocesos de grupo de subprocesos: ¿están dentro del mismo proceso? –

+0

Soy bastante nuevo en la programación .net. Han estado programando en PHP desde hace algunos años, y nunca se notan tales problemas. Esto es mucho más fácil. Así que no estoy seguro de qué quiso decir con "subprocesos de fila de subprocesos"? Con una solicitud, creo dos o más esta solicitud HTTP al servicio WCF, por lo que está dentro del mismo proceso/solicitud. ¿Debo usar el almacenamiento en caché para estas solicitudes? – AnzeR

0

Como este es un comportamiento realmente extraño, me gustaría saber si hay otras formas de llamar al servicio WCF alojado en el mismo servidor IIS. También creo que la creación de una conexión TCP para ese tipo de llamadas no está realmente optimizada y todos los demás enfoques deberían ser mucho más rápidos.

6

Tuve el mismo problema y agregué una llamada al HttpWebRequest.Abort() para solucionarlo.

+0

¡Gracias! Me ayudó a solucionar mi problema. conexiones correctamente;) – pila

0

La primera cosa a tener en cuenta es la revisión de los URI, los parámetros y las cabeceras de ser enviado, en concreto:

  • caracteres reservados. Enviar caracteres reservados por el URI puede traer problemas ! * ' () ; : @ & = + $ ,/? # []
  • URI Longitud: Usted no debe exceder los 2000 caracteres
  • cabeceras de longitud: La mayoría de los servidores web hacen límite de tamaño de las cabeceras que aceptan. Por ejemplo, en el límite predeterminado de Apache es de 8 KB.

Tenga en cuenta que si desea enviar datos de una longitud más larga, se recomienda enviarlos en el cuerpo del mensaje.

Cuestiones relacionadas