¿Cómo entregar archivos grandes en ASP.NET Response?

No estoy buscando ninguna alternativa para transmitir el contenido del archivo desde la base de datos, de hecho, estoy buscando la raíz del problema, esto fue ejecutar el archivo hasta IIS 6, donde ejecutamos nuestra aplicación en modo clásico, ahora actualizamos nuestro IIS a 7 y nosotros están ejecutando el grupo de aplicaciones en modo de canalización y comenzó este problema.

Tengo un controlador, donde tengo que entregar archivos grandes a solicitud del cliente. Y me enfrento a los siguientes problemas,

Los archivos tienen un tamaño promedio de 4 a 100 MB, así que consideremos un caso de descarga de archivos de 80 MB.

Buffering On, Slow Start

Response.BufferOutput = True;

Esto da como resultado un inicio muy lento del archivo, ya que las descargas del usuario e incluso la barra de progreso no aparecen hasta unos segundos, generalmente de 3 a 20 segundos, la razón es que IIS lee primero el archivo completo, determina la longitud del contenido y luego comienza el archivo transferir. El archivo se está reproduciendo en el reproductor de video y funciona muy lento, sin embargo, el iPad solo descarga una fracción del archivo primero, por lo que funciona rápido.

Buffering Off, Sin longitud de contenido, Inicio rápido, Sin progreso

Reponse.BufferOutput = False;

Esto da como resultado un inicio inmediato, sin embargo, el cliente final (navegador típico como Chrome) no conoce la longitud del contenido, ya que IIS tampoco lo sabe, por lo que no muestra el progreso, sino que dice X KB descargado.

Buffering Off, Longitud de contenido manual, Inicio rápido, Progreso y violación del protocolo

Response.BufferOutput = False;
Response.AddHeader("Content-Length", file.Length);

Esto da como resultado la correcta descarga inmediata del archivo en Chrome, etc. Sin embargo, en algunos casos, el controlador IIS produce el error "Conexión cerrada de cliente remoto" (esto es muy frecuente) y otros resultados de WebClient en la violación del protocolo. @Esto ocurre entre el 5 y el 10% de todas las solicitudes, no todas las solicitudes.

Supongo que lo que está sucediendo es que IIS no envía nada llamado 100 continuar cuando no hacemos almacenamiento en búfer y el cliente puede desconectarse sin esperar ningún resultado. Sin embargo, leer archivos desde la fuente puede llevar más tiempo, pero en el lado del cliente he aumentado el tiempo de espera, pero parece que el tiempo de espera de IIS no tiene control.

De todos modos, puedo forzar a Response a enviar 100 continuar y no dejar que nadie cierre la conexión?

ACTUALIZA

Encontré los siguientes encabezados en Firefox / Chrome, nada parece inusual aquí por violación de protocolo o encabezado incorrecto.

Access-Control-Allow-Headers:*
Access-Control-Allow-Methods:POST, GET, OPTIONS
Access-Control-Allow-Origin:*
Access-Control-Max-Age:1728000
Cache-Control:private
Content-Disposition:attachment; filename="24.jpg"
Content-Length:22355
Content-Type:image/pjpeg
Date:Wed, 07 Mar 2012 13:40:26 GMT
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

UPDATE 2

Turning Recycling todavía no ofrecía mucho, pero he aumentado mi MaxWorkerProcess a 8 y ahora obtengo menos errores que antes.

Pero en promedio, de 200 solicitudes en un segundo, fallan de 2 a 10 solicitudes ... y esto sucede en casi cada segundo alternativo.

UPDATE 3

Continuando el 5% de las solicitudes que fallan con "El servidor cometió una violación del protocolo. Sección = ResponseStatusLine", tengo otro programa que descarga contenido del servidor web que usa WebClient, y que da este error 4-5 veces por segundo, en promedio Tengo un 5% de solicitudes que fallan. ¿Hay alguna forma de rastrear la falla de WebClient?

Problemas redefinidos

Zero Byte File Received

IIS cierra la conexión por alguna razón, en el lado del cliente en WebConfig, recibo 0 bytes para el archivo que no es cero bytes, hacemos la comprobación de hash SHA1, esto nos dijo que en el servidor web IIS no se registra ningún error.

Este fue mi error, y se resolvió ya que estamos usando Entity Framework, estaba leyendo sucio (filas no confirmadas) ya que la lectura no estaba en el alcance de la transacción, ponerlo en el alcance de la transacción ha resuelto este problema.

Excepción de violación de protocolo planteada

WebClient lanza WebException diciendo "El servidor cometió una violación de protocolo. Sección = ResponseStatusLine.

Sé que puedo habilitar el análisis de encabezado inseguro, pero ese no es el punto, cuando es mi controlador HTTP el que envía los encabezados adecuados, no sé por qué IIS está enviando algo extra (comprobado en Firefox y Chrome, nada inusual), esto sucede solo 2% de las veces.

UPDATE 4

Found sc-win32 64 error y leí en alguna parte que WebLimits para MinBytesPerSecond debe cambiarse de 240 a 0, pero todo sigue igual. Sin embargo, he notado que cada vez que IIS registra un error de 64 sc-win32, IIS registra el estado HTTP como 200 pero hubo algún error. Ahora no puedo activar el Registro de seguimiento fallido para 200 porque generará archivos masivos.

mbos problemas anteriores se resolvieron aumentando MinBytesPerSecond y desactivando Sesiones, agregué respuestas detalladas que resumen cada punto.

Respuestas a la pregunta(8)

Su respuesta a la pregunta