2012-03-30 7 views
6

Una página de cliente usa javascript para publicar datos de formularios de varias partes (archivos) en mi sitio ASP.NET (controlador ashx).Manejo de HTTP POST concurrentes de gran tamaño en la aplicación ASP.NET

El usuario selecciona varios archivos e inicia una carga simultánea. Cuando los archivos son como 150MB +, esto genera varios controladores POST simultáneos del lado del servidor ASP.NET.

Tengo el control de sesión implementado, junto con la funcionalidad de captcha para saber exactamente si no es un bot inundando mi servidor.

Pero el problema es con el inicio de carga inicial.

Cada vez que un controlador es para procesar una POST, se comprueba un ID de la sesión (mi sesión personalizado, uno por cada página de usuario), y añade el tamaño Request.ContentLength al tamaño total de archivos POST cados por sesión. Esta información se guarda en un XML.

Pero dado que varias publicaciones iniciales se producen simultáneamente, un escritor XML que registra la suma de bytes "estrangula" e informa 0 bytes por sesión para todos los POST s iniciales, ya que entran al mismo tiempo.

Implementé lock en mi objeto persister (que hace escritura XML), pero ahora hasta que un POST se haya procesado por completo, otros no pueden continuar.

Además, aunque no hago nada con las solicitudes que vienen "después del límite de carga", todavía toman tiempo para cargar los datos en el servidor.

Así que mis preguntas son:

¿Cuál es el patrón correcto para procesar varios POST cargas simultáneas?

¿Hay alguna forma de eliminar inmediatamente el POST tan pronto como se filtre la solicitud en el código del controlador ASP.NET y ahorrarle al cliente el esfuerzo de cargar los datos en IIS?

ACTUALIZACIÓN: Cuando lock solo en la escritura de XML/cálculo de la longitud de sesión máxima todavía tengo la concurrencia, lo cual es bueno. Ahora solo necesito encontrar la forma de desconectar la sesión inmediatamente del código del controlador de ashx.

+0

¿Son todas las peticiones HTTP al grabar en el mismo archivo? Suena como un mal diseño. Es posible que deba pensar en utilizar algún servicio de puesta en cola de mensajes para encargarse de esto. También es aconsejable conservar los datos en una base de datos. – deostroll

+0

Este caso en particular ocurre cuando en la misma sesión (lo que significa en la misma carpeta) se están guardando dos archivos del mismo nombre. En cuanto a la base de datos, es una gran idea, pero HttpPostedFile tiene un método SaveAs que toma una ruta en un sistema de archivos. No he investigado cómo serializar los archivos publicados en DB con ASP.NET. –

Respuesta