2010-10-25 20 views
14

Queremos restringir el tamaño máximo del archivo de carga en nuestro sitio web. Ya hemos establecido los límites adecuados en nuestro web.config. El problema que nos encontramos es que si se carga un archivo grande (1 GB, por ejemplo), el archivo completo se carga antes de que se genere un error en el servidor, y el tipo de error es diferente si el el archivo es enorme o no.Impedir la carga de archivos de gran tamaño en ASP.NET 4.0

¿Hay alguna forma de detectar el tamaño de una carga de archivo pendiente antes de que se realice la carga real?

Aquí está mi configuración web.config pertinentes que restringen las solicitudes a 16 MB:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.web> 
     <httpRuntime maxRequestLength="12288"/> 
    </system.web> 

    <system.webServer> 
     <security> 
      <requestFiltering> 
       <requestLimits maxAllowedContentLength="12582912"/> 
      </requestFiltering> 
     </security> 
    </system.webServer> 
</configuration> 

que he intentado crear un módulo HTTP para que pudiera interceptar una solicitud temprano en la solicitud de ciclo de vida, pero las subidas parecen tener lugar incluso antes de que el caso de BeginRequestHttpApplication:

public class UploadModule : IHttpModule 
{ 
    private const int MaxUploadSize = 12582912; 

    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += handleBeginRequest; 
    } 

    public void Dispose() 
    { 
    } 

    private void handleBeginRequest(object sender, EventArgs e) 
    { 
     // The upload takes place before this method gets called. 

     var app = sender as HttpApplication; 

     if (app.Request.Files.OfType<HttpPostedFile>() 
      .Any(f => f.ContentLength > MaxUploadSize)) 
     { 
      app.Response.StatusCode = 413; 
      app.Response.StatusDescription = "Request Entity Too Large"; 
      app.Response.End(); 
      app.CompleteRequest(); 
     } 
    } 
} 

actualización:

Sé que las tecnologías del lado del cliente como Flash pueden detectar tamaños de archivo antes de la carga, pero necesitamos una solución del lado del servidor porque queremos apuntar a plataformas que no tienen soporte Flash/Java/ActiveX/Silverlight. Creo que IIS o ASP.NET tienen un error que permite que se carguen archivos de gran tamaño a pesar de los límites, por lo que he archivado un error here.

¿Una extensión ISAPI me da más control sobre el procesamiento de solicitudes que los módulos y manejadores HTTP, como permitirme abortar una carga si se ve que el encabezado Content-Length es mayor que el límite permitido?

Actualización 2:

suspiro. Microsoft ha cerrado el error que archivé como duplicado pero no proporcionó información adicional. Con suerte, no solo dejaron caer la pelota en esto.

Actualización 3:

Hooray! Según Microsoft:

Este error se está resolviendo porque se transfirió al equipo del producto IIS. Desde entonces, el equipo de IIS corrigió el error, que se incluirá en la versión futura de Windows.

+0

+1 a la pregunta; interesado en este tema yo mismo Tengo entendido que no se puede hacer nada hasta que entre toda la solicitud, y ciertamente el código que se intenta usar no tiene forma de saberlo de antemano. Creo que tomaría algo antes en el proceso de solicitud; como en el lado del cliente, o antes de que IIS/ASP.NET obtenga la solicitud, a medida que la solicitud comienza a transmitirse. –

+0

puede ser que pueda referirse a esto: http://stackoverflow.com/questions/14032918/setting-maxrequestlength -programmatically/14033087 # 14033087 –

Respuesta

2

Microsoft tiene responded on their Microsoft Connect site con lo siguiente:

Este error se resuelve como se ha portado a la selección del producto de IIS. Desde entonces, el equipo de IIS corrigió el error, que se incluirá en la versión futura de Windows.

Si está solicitando una solución para el sistema operativo actual, se debe abrir una solicitud QFE. Por favor, avíseme si esta es la ruta que desea tomar. Tenga en cuenta que abrir una solicitud de QFE no significa necesariamente que se apruebe.

Así que supongo que tenemos que esperar a la próxima versión de IIS para la solución (a menos que una solicitud QFE se ha cumplido, lo que es).

2

¿Hay una manera de detectar el tamaño de una pendiente de subida de archivo antes de la carga real se lleva a cabo?

No. Eso requeriría acceso al tamaño del archivo en el cliente. Permitir que un servidor web tenga acceso directo a los archivos en el cliente sería un poco peligroso.

Su mejor opción es colocar una línea de texto que indique el tamaño de archivo máximo permitido.

O puede crear algún tipo de control ActiveX, applet Java, etc. para que no dependa de las restricciones del navegador.Luego debe convencer a sus usuarios para que lo instalen. Probablemente no sea la mejor solución.

+1

correcto. pero debería haber una manera de detectar el tamaño de archivo cargado antes de que todo el archivo se cargue en el servidor: podemos leer el encabezado "Content-Length" justo después de que se haya recibido y analizado el encabezado de la solicitud (pero antes de que se haya procesado toda la solicitud)) Lo actualizaré más tarde. –

+0

Aquí: http://stackoverflow.com/questions/14032918/setting-maxrequestlength-programmatically/14033087#14033087 –

2

El problema es que la carga se realiza de una sola vez con la solicitud HTTP Post, por lo que solo puede detectarla una vez que se haya completado.

Si desea tener más control sobre esto, debe probar los widgets de carga basados ​​en Flash que tienen esto y mucho más. Echa un vistazo a este enlace http://www.ajaxline.com/10-most-interesting-upload-widgets

+1

Haces que parezca que esto es una limitación fundamental en HTTP, donde en realidad es una limitación en el software del servidor web. – Charlie

0

Bueno .... Depende del nivel bajo que desee obtener.

Cree una aplicación de servicio que actúe como proxy para IIS. (Todas las solicitudes de socket del puerto 80 entrantes van al servicio.) Haga que el servicio pase todo lo que recibe a IIS (sitio web que escucha en un puerto o IP diferente), pero monitoree el tamaño total de la solicitud tal como se recibió. Cuando el tamaño de una conexión dada excede el límite deseado, cierre la conexión. Devuelve un redireccionamiento a una página de error si quieres ser cortés.

tonto, pero le permitirá controlar los datos en tránsito sin esperar a que IIS le entregue la solicitud.

Cuestiones relacionadas