none
Capturar excepcion de "System.Web.HttpException: Se excedió la longitud de solicitud máxima" RRS feed

  • Pregunta

  • Hola.

    Tengo un uploadfile en una página asp.net (c#). Que permite subir un fichero al servidor, le he limitado el tamaño a 20Mb pero si el cliente intenta subir uno mayor se genera una excepción que no consigo controlar.

    En el web.config tengo:

    <system.web>
    <httpRuntime maxRequestLength="20480" executionTimeout="180" />
    ...
    
    <system.webServer>
    <security>
    <requestFiltering>
    <requestLimits maxAllowedContentLength="20971520" />
    </requestFiltering>
    </security>
    ...

    Si poner la segunda parte del web.config tengo esta traza (que he visto por internet que se repite):

    [HttpException (0x80004005): Se excedió la longitud de solicitud máxima.]
       System.Web.HttpRequest.GetEntireRawContent() +12340605
       System.Web.HttpRequest.GetMultipartContent() +221
       System.Web.HttpRequest.FillInFormCollection() +357
       System.Web.HttpRequest.EnsureForm() +110
       System.Web.HttpRequest.get_HasForm() +12343067
       System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull) +146
       System.Web.UI.Page.DeterminePostBackMode() +129
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +322
    

    Si activo la segunda parte del web.config, entonces me sale un mensaje personalizado.

    "Error HTTP 404.13 - Not Found
    El módulo Solicitar filtrado está configurado para denegar una solicitud que supera la longitud del contenido."

    Además en el Global.aspx tengo:

        void Application_Error(object sender, EventArgs e) 
        { 
            // Código que se ejecuta al producirse un error no controlado
    
            // Controla si se ha lanzado la excepción de fichero demasiado grande.
            Exception ex = Server.GetLastError();
            HttpException httpException = (HttpException)ex ?? (HttpException)ex.InnerException; // 1º==null => 2º
            if (ex != null) Response.Write("Excepcion = " + ex.ToString() + "<br />");
            if (httpException == null) return;
            if (httpException.WebEventCode == System.Web.Management.WebEventCodes.RuntimeErrorPostTooLarge)
            {
                Response.Write("El fichero es demasiado grande, recuerde que está limitado a 20Mb.");
            }
        }

    ¿No hay forma de capturar esta excepción? ¿estoy haciendo algo mal?

    Muchas gracias.




    viernes, 19 de junio de 2015 12:09

Respuestas

  • Al final encontré la forma de capturar la excepción (para el caso del servidor de desarrollo que el otro "aún colea") ...

        <system.webServer>
            <security>
                <requestFiltering>
                    <requestLimits maxAllowedContentLength="20971520" />
                </requestFiltering>
            </security>
            <httpErrors errorMode="Custom" existingResponse="Replace">
                <remove statusCode="404" subStatusCode="13" />
                <error statusCode="404" subStatusCode="13" prefixLanguageFilePath="" path="http://localhost/pru/SubirError.aspx" responseMode="Redirect" />
            </httpErrors>

    Dicen que no hay mal que cien años dure, pero la leche con este error.

    Muchas gracias a todos los que habéis respondido.


    PD: la página donde lo encontré  http://stackoverflow.com/questions/2759193/display-custom-error-page-when-file-upload-exceeds-allowed-size-in-asp-net-mvc

    ¡al Cesar lo que es del Cesar!



    • Marcado como respuesta Miguel_Po martes, 23 de junio de 2015 16:28
    • Editado Miguel_Po martes, 23 de junio de 2015 16:35
    martes, 23 de junio de 2015 16:28

Todas las respuestas

  • hola

    >>le he limitado el tamaño a 20Mb pero si el cliente intenta subir uno mayor se genera una excepción que no consigo controlar.

    pero la exception se genera justamente porque estas excediendo el limite que has fijado

    podrias definir un try...catch en el codigo para controlar el problema

    aunque veo que defines el evento Application_Error, si pones un breakpoint puedes evaluar que ingresa alli cuando se produce el error?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 19 de junio de 2015 12:35
  • prueba esto para controlar el error y redirigir a una pagina personalizada

    protected void Application_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();
        if (ex is HttpUnhandledException)
        {
            ex = ex.InnerException;
            if (ex != null && ex.Message.Contains("Maximum request length exceeded."))
            {
                this.Server.ClearError();
                this.Server.Transfer("~/MaxUploadError.aspx");
            }
        }
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 19 de junio de 2015 13:34
    Moderador
  • Muchas gracias por tu interés.

    Tengo el código dentro de un try-catch, el problema es que "creo" que la excepción se lanza antes del código, algo muy raro.

    El código de la Application_Error no se llega a ejecutar.

    Saludos.

    lunes, 22 de junio de 2015 8:01
  • Muchas gracias por tu respuesta.

    Nada. El problema es que no llega a ejecutarse la función, ni tampoco el código encargado de subirla (el cual tiene un try-catch). Es algo muy extraño, el error se dan en antes de llegar al evento del _Click del botón de la página.

    Saludos.


    Edit. Este es el contenido del botón:

    <asp:Button ID="ContenidoSubir" runat="server" Text="Subir Contenido" OnClick="ContenidoSubir_Click" Visible="true" />

    y "ContenidoSubir_Click" contiene un try-catch que abarca todo el código.
    • Editado Miguel_Po lunes, 22 de junio de 2015 8:12
    lunes, 22 de junio de 2015 8:05
  • Y si envías un archivo de menor tamaño tienes algún problema?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    lunes, 22 de junio de 2015 8:09
    Moderador
  • Échale un vistazo a este post. Muestra un forma de interceptarlo en el evento Application_Error del global.asax:

    Catching “Maximum request length exceeded”


    Píldoras .NET
    Píldoras JS


    lunes, 22 de junio de 2015 8:15
  • Hola.

    Lo sube sin problemas. Vamos todo bien.

    lunes, 22 de junio de 2015 9:35
  • Una pregunta...

    has probado con aumentar ambos valores en tu web.config?

    <httpRuntime maxRequestLength="20480" executionTimeout="180" />



    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    lunes, 22 de junio de 2015 9:49
    Moderador
  • Otra pregunta mas lo siento, como servidor web qué estas empleando?

    IIS Express o IIS local?


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    lunes, 22 de junio de 2015 9:50
    Moderador
  • Hola.

    Si, la excepción se da de forma inmediata. De hecho le tengo puesto 1800 segundos.

    Lo único que se me ocurre es que hay código que se ejecuta antes del _Click (evento que sube el fichero) y comprueba el tamaño a subir y al ser mayor genera la excepción.

    lunes, 22 de junio de 2015 11:09
  • Hola.

    IIS local: Internet Information Services 7.5 ... llevás razón, voy a probarlo en explotación por si "suena la flauta". Gracias.

    lunes, 22 de junio de 2015 11:11
  • Yo he probado en local la solución del post que te comentaba con el IIS Express de VS 2013 y me funciona bien.

    El código que he utilizado en el global.asax:

            protected void Application_Error(object sender, EventArgs e)
            {
                if (IsMaxRequestExceededException(this.Server.GetLastError()))
                {
                    this.Server.ClearError();
                    this.Server.Transfer("~/ErrorMaxRequestExceeded.html");
                }
            }
    
            const int TimedOutExceptionCode = -2147467259;
            private static bool IsMaxRequestExceededException(Exception e)
            {
                // unhandled errors = caught at global.ascx level
                // http exception = caught at page level
    
                Exception main;
                var unhandled = e as HttpUnhandledException;
    
                if (unhandled != null && unhandled.ErrorCode == TimedOutExceptionCode)
                {
                    main = unhandled.InnerException;
                }
                else
                {
                    main = e;
                }
    
    
                var http = main as HttpException;
    
                if (http != null && http.ErrorCode == TimedOutExceptionCode)
                {
                    // hack: no real method of identifying if the error is max request exceeded as 
                    // it is treated as a timeout exception
                    if (http.StackTrace.Contains("GetEntireRawContent"))
                    {
                        // MAX REQUEST HAS BEEN EXCEEDED
                        return true;
                    }
                }
    
                return false;
            }


    Píldoras .NET
    Píldoras JS


    lunes, 22 de junio de 2015 11:52
  • En el servidor (windows server 2012 R2 NO da el problema).

    ¡Pues en explotación es donde debe funcionar!. Voy a probar, que me va muy lento subiendo, pero de entrada el error inmediato no me lo da. Al final me falla pero no me da ese error, ahora está unos 5 min subiendo y salta un error.

    lunes, 22 de junio de 2015 11:55
  • Ese es el timeout de executioTimeout de httpruntime casi seguro

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    lunes, 22 de junio de 2015 12:00
    Moderador
  • ¡No hay forma de capturar la excepción!

    En el servidor de explotación, permite subir hasta los 20Mb que he puesto de tope sin problemas. Te pasas 1kb y salta una excepción no controlada:

    Conexión segura fallida
    La conexión al servidor fue reiniciada mientras la página se cargaba.
    La página que está intentando ver no se puede mostrar porque la autenticidad de los datos recibidos no ha podido ser verificada.
    Contacte con los propietarios del sitio web para informarles de este problema.

    Tengo un session.timeout de 60 minutos y de 1800 segundos para subir el fichero (que por supuesto no se llega a consumir).

    ¡Si no fuese por estos ratos, la vida sería muy aburrida!

    martes, 23 de junio de 2015 11:00
  • Aunque sea dar palos de ciego ¿has probado con diferentes navegadores?

    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...


    martes, 23 de junio de 2015 11:19
  • Si. Ya tengo la solución (para uno de ellos) :-) :-) :-) :-)

    Este ha sido duro.


    • Editado Miguel_Po martes, 23 de junio de 2015 16:35
    martes, 23 de junio de 2015 16:19
  • puedes explicar tu solución?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 23 de junio de 2015 16:23
    Moderador
  • Al final encontré la forma de capturar la excepción (para el caso del servidor de desarrollo que el otro "aún colea") ...

        <system.webServer>
            <security>
                <requestFiltering>
                    <requestLimits maxAllowedContentLength="20971520" />
                </requestFiltering>
            </security>
            <httpErrors errorMode="Custom" existingResponse="Replace">
                <remove statusCode="404" subStatusCode="13" />
                <error statusCode="404" subStatusCode="13" prefixLanguageFilePath="" path="http://localhost/pru/SubirError.aspx" responseMode="Redirect" />
            </httpErrors>

    Dicen que no hay mal que cien años dure, pero la leche con este error.

    Muchas gracias a todos los que habéis respondido.


    PD: la página donde lo encontré  http://stackoverflow.com/questions/2759193/display-custom-error-page-when-file-upload-exceeds-allowed-size-in-asp-net-mvc

    ¡al Cesar lo que es del Cesar!



    • Marcado como respuesta Miguel_Po martes, 23 de junio de 2015 16:28
    • Editado Miguel_Po martes, 23 de junio de 2015 16:35
    martes, 23 de junio de 2015 16:28
  • Perdona, ya la he puesto ...

    Gracias por tu interés.

    martes, 23 de junio de 2015 16:29
  • Gracias. Muy buen trabajo

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 23 de junio de 2015 16:36
    Moderador
  • Perdona por no responderte antes, ... ... ...

    El problema en mi caso es que no ejecuta nada del gobal.asax, se lanza la excepción y ni lo huele ??? muy raro.

    Como comento al final solo redefiniendo la página del error lo consigo capturar.

    Muchas gracias por tu interés.

    martes, 23 de junio de 2015 16:38
  • La verdad es que no sé de que depende exactamente. Yo había probado esa solución y no me funcionó, sin embargo si pude capturar la excepción desde el Global.asax.

    ¿Dependerá del IIS o del Framework?


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...


    martes, 23 de junio de 2015 19:57
  • Hola.

    Desde luego me he encontrado con cosas raras, pero como esto ... no tengo palabras.

    jueves, 25 de junio de 2015 8:37