2009-09-13 6 views
5

Tengo un código bastante simple que carga una foto o video a un punto final (usando HTTP PUT o POST). De vez en cuando veo conexiones cerradas, excepciones lanzadas, y en realidad la foto/video fue cargada muy bien, está llamando a GetResponse donde ocurre la excepción.¿Por qué bloquea HttpWebRequest GetResponse durante tanto tiempo?

Una cosa que he notado es que GetResponse puede tardar muchísimo tiempo en procesarse. A menudo es más largo que el tiempo de carga real de la foto en el servidor. Mi código escribe en el servidor web usando RequestStream.Write.

Hice una pequeña prueba y subí alrededor de 40 fotos/videos al servidor que varían en tamaño de 1MB a 85MB y el tiempo para devolver GetResponse fue de 3 a 40 segundos.

Mi pregunta es, ¿es esto normal? ¿Es solo cuestión de cuánto tardará el servidor al que estoy cargando estos archivos para procesar mi solicitud y responder? Al observar las huellas HTTP de Fidder, parece ser el caso.

FYI, mis subidas son HTTP 1.0, los valores de tiempo de espera ajustado infinito (tanto en tiempo de espera y ReadWriteTimeout)

+1

Omar: Si hace clic en una sesión de Fiddler y elegir "Propiedades", se puede ver la colección de temporizadores para esa sesión.Dos valores interesantes son "ServerGotRequest" y "ServerBeginResponse". ¿Cuál es el delta entre esos? – EricLaw

Respuesta

6

Si el servidor es genuinamente tardando mucho tiempo en devolver cualquier dato (como se muestra en Fiddler), entonces esa es la causa. Cargar un archivo adjunto de 85MB tomaría mucho tiempo para comenzar, y luego el servidor tiene que procesarlo. No puede hacer mucho al respecto, salvo utilizar un método asíncrono si puede continuar con más trabajo antes de que la llamada regrese.

No es en su totalidad claro lo que Fiddler te está mostrando, ¿está mostrando mucho tiempo antes de que el servidor envíe la respuesta? Si es así, no hay mucho que puedas hacer. Estoy sorprendido de que la conexión esté cerrada para usted, lo admito. Sin embargo, si no ve sus datos como escritos en el servidor por un tiempo, esa es una cuestión diferente.

¿Está dispuesto a devolver la respuesta? Si no, puedes tener conexiones que se mantienen vivas. Este no debería ser ser un problema si es explícitamente HTTP 1.0, pero es la causa más común de llamadas colgadas de la web en mi experiencia.

Básicamente, si no dispone de un WebResponse, normalmente (al menos con HTTP 1.1 y keepalive) se aferrará a la conexión. Hay un límite en la cantidad de conexiones que pueden abrirse para un solo host, por lo que podría terminar esperando hasta que se finalice una respuesta antes de poder continuar.

Si esto es el problema, un simple using comunicado es la respuesta:

using (WebResponse response = request.GetResponse()) 
{ 
    ... 
} 
+0

Sí, estoy usando el método de uso en la respuesta y leyendo el GetResponseStream. En este caso, parece que tengo que vivir con el hecho de que lleva mucho tiempo ... –

0

Sí, el tiempo de respuesta puede ser mucho más tiempo que el tiempo de carga. Después de que la solicitud se haya enviado al servidor, debe procesarse y debe enviarse una respuesta. Puede pasar un tiempo hasta que se procese la solicitud y, por lo general, el archivo se guardará en alguna parte. Después de eso, el servidor creará la página de respuesta que se envía de vuelta.

IIS maneja solo una solicitud a la vez de cada usuario, por lo que si comienza otra carga antes de que se complete la primera, esperará hasta que la primera se complete antes de comenzar a procesar la siguiente.

+1

<< IIS maneja solo una solicitud a la vez de cada usuario >> es absolutamente falso. Supongo que está confundiendo IIS con el objeto ASP "Session", que sí contenía un mutex que podría limitar el número de páginas que se ejecutan simultáneamente por usuario. – EricLaw

+0

@EricLaw: No sé exactamente qué parte del servidor web está limitando el motor a una página por usuario, pero como se trata de una pregunta .NET estamos hablando de solicitudes que pasan por el motor ASP.NET. Definitivamente es cierto que el servidor solo manejará una solicitud a la vez de cada usuario. – Guffa

Cuestiones relacionadas