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 BeginRequest
HttpApplication
:
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.
+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. –
puede ser que pueda referirse a esto: http://stackoverflow.com/questions/14032918/setting-maxrequestlength -programmatically/14033087 # 14033087 –