Estoy escribiendo una función de carga y tengo problemas para detectar "System.Web.HttpException: Excedió la longitud máxima de la solicitud" con archivos más grandes que el tamaño máximo especificado en httpRuntime
en web.config (tamaño máximo establecido en 5120). Estoy usando un simple <input>
para el archivo.
El problema es que la excepción se lanza antes del evento de clic del botón de carga, y la excepción ocurre antes de que se ejecute mi código. Entonces, ¿cómo atrapo y manejo la excepción?
EDITAR: La excepción se lanza instantáneamente, así que estoy bastante seguro de que no es un problema de tiempo de espera debido a conexiones lentas.
c#
asp.net
httpexception
Marcus L
fuente
fuente
<input type="file" id="upload" name="upload" onchange="showFileSize();" />
InsideshowFileSize()
, puede mostrar un mensaje de error basado en el tamaño de su archivovar input = document.getElementById("upload"); var file = input.files[0];
y agregar una etiqueta html.Respuestas:
Desafortunadamente, no existe una manera fácil de detectar esta excepción. Lo que hago es anular el método OnError en el nivel de la página o Application_Error en global.asax, luego verificar si fue una falla de Max Request y, si es así, transferirlo a una página de error.
Es un truco, pero el siguiente código funciona para mí.
fuente
httpException.WebEventCode == WebEventCodes.RuntimeErrorPostTooLarge
- usando System.Web.Management.WebEventCodesComo dijo GateKiller, debe cambiar maxRequestLength. También es posible que deba cambiar el executionTimeout en caso de que la velocidad de carga sea demasiado lenta. Tenga en cuenta que no desea que ninguna de estas configuraciones sea demasiado grande, de lo contrario estará expuesto a ataques de DOS.
El valor predeterminado para el tiempo de espera de ejecución es 360 segundos o 6 minutos.
Puede cambiar maxRequestLength y executionTimeout con el elemento httpRuntime .
EDITAR:
Si desea manejar la excepción independientemente, como ya se ha dicho, deberá manejarla en Global.asax. Aquí hay un enlace a un ejemplo de código .
fuente
Puede resolver esto aumentando la longitud máxima de la solicitud en su web.config:
El ejemplo anterior es para un límite de 100 Mb.
fuente
Si también desea una validación del lado del cliente para que tenga menos necesidad de lanzar excepciones, puede intentar implementar la validación del tamaño del archivo del lado del cliente.
Nota: esto solo funciona en navegadores compatibles con HTML5. http://www.html5rocks.com/en/tutorials/file/dndfiles/
fuente
Hola solución mencionada por Damien McGivern, funciona solo en IIS6,
No funciona en IIS7 y ASP.NET Development Server. Aparece la página "404 - Archivo o directorio no encontrado".
¿Algunas ideas?
EDITAR:
Entendido ... Esta solución todavía no funciona en ASP.NET Development Server, pero tengo la razón por la que no funcionaba en IIS7 en mi caso.
La razón es que IIS7 tiene un escaneo de solicitudes incorporado que impone un límite de archivo de carga que tiene un valor predeterminado de 30000000 bytes (que es un poco menos de 30 MB).
Y estaba intentando cargar un archivo de tamaño 100 MB para probar la solución mencionada por Damien McGivern (con maxRequestLength = "10240", es decir, 10 MB en web.config). Ahora, si subo el archivo de tamaño> 10 MB y <30 MB, la página se redirige a la página de error especificada. Pero si el tamaño del archivo es> 30 MB, se mostrará la fea página de error incorporada que muestra "404 - Archivo o directorio no encontrado".
Entonces, para evitar esto, debes aumentar el máximo. longitud permitida del contenido de la solicitud para su sitio web en IIS7. Eso se puede hacer usando el siguiente comando,
He establecido el máximo. longitud del contenido a 200 MB.
Después de realizar esta configuración, la página se redirige con éxito a mi página de error cuando intento cargar un archivo de 100 MB
Consulte http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx para obtener más detalles.
fuente
Aquí hay una forma alternativa, que no implica ningún "truco", pero requiere ASP.NET 4.0 o posterior:
fuente
Una forma de hacerlo es establecer el tamaño máximo en web.config como ya se ha indicado anteriormente, por ejemplo
luego, cuando maneje el evento de carga, verifique el tamaño y si supera una cantidad específica, puede atraparlo, por ejemplo
fuente
Una solución que funciona con IIS7 y versiones posteriores: muestra una página de error personalizada cuando la carga del archivo excede el tamaño permitido en ASP.NET MVC
fuente
En IIS 7 y posteriores:
archivo web.config:
Luego puede verificar el código subyacente, así:
Solo asegúrese de que el [Tamaño en bytes] en web.config sea mayor que el tamaño del archivo que desea cargar, entonces no obtendrá el error 404. Luego puede verificar el tamaño del archivo en el código detrás usando ContentLength, que sería mucho mejor
fuente
Como probablemente sepa, la longitud máxima de la solicitud se configura en DOS lugares.
maxRequestLength
- controlado a nivel de la aplicación ASP.NETmaxAllowedContentLength
- bajo<system.webServer>
, controlado a nivel IISEl primer caso está cubierto por otras respuestas a esta pregunta.
Para atrapar EL SEGUNDO , debe hacer esto en global.asax:
fuente
Después de la etiqueta
agregue la siguiente etiqueta
puede agregar la URL a la página de error ...
fuente
Puede resolver esto aumentando la duración máxima de la solicitud y el tiempo de espera de ejecución en su web.config:
-Por favor, aclare el tiempo máximo de ejecución más grande que 1200
fuente
¿Qué tal atraparlo en el evento EndRequest?
fuente
Se puede comprobar a través de:
fuente