[asp.net-mvc] ¿Cómo hacer que ELMAH trabaje con el atributo ASP.NET MVC [HandleError]?



3 Answers

Lo siento, pero creo que la respuesta aceptada es excesiva. Todo lo que necesitas hacer es esto:

public class ElmahHandledErrorLoggerFilter : IExceptionFilter
{
    public void OnException (ExceptionContext context)
    {
        // Log only handled exceptions, because all other will be caught by ELMAH anyway.
        if (context.ExceptionHandled)
            ErrorSignal.FromCurrentContext().Raise(context.Exception);
    }
}

y luego registrarlo (el orden es importante) en Global.asax.cs:

public static void RegisterGlobalFilters (GlobalFilterCollection filters)
{
    filters.Add(new ElmahHandledErrorLoggerFilter());
    filters.Add(new HandleErrorAttribute());
}
Question

Estoy tratando de usar ELMAH para registrar errores en mi aplicación ASP.NET MVC, sin embargo, cuando uso el atributo [HandleError] en mis controladores, ELMAH no registra ningún error cuando se producen.

Como supongo, es porque ELMAH solo registra errores no controlados y el atributo [HandleError] está manejando el error, por lo que no es necesario iniciar sesión.

¿Cómo modifico o cómo voy a modificar el atributo para que ELMAH pueda saber que hubo un error y registrarlo?

Editar: Permítanme asegurarme de que todos entiendan, sé que puedo modificar el atributo, no es la pregunta que estoy formulando ... ELMAH se saltea al usar el atributo handleerror, lo que significa que no verá que hubo un error porque se manejó ya por el atributo ... Lo que estoy preguntando es si hay una manera de hacer que ELMAH vea el error y lo logre aunque el atributo lo maneje ... Busqué alrededor y no veo ningún método al que llamar para forzarlo a que inicie sesión el error....




Una solución completamente alternativa es no usar MVC HandleErrorAttribute , y en su lugar confiar en el manejo de errores ASP.Net, que Elmah está diseñado para trabajar.

HandleErrorAttribute eliminar el HandleErrorAttribute global predeterminado de App_Start \ FilterConfig (o Global.asax), y luego configurar una página de error en su Web.config:

<customErrors mode="RemoteOnly" defaultRedirect="~/error/" />

Tenga en cuenta que esto puede ser una URL enrutada MVC, por lo que lo anterior redirigiría a la acción ErrorController.Index cuando ocurra un error.




¡Esto es exactamente lo que necesitaba para la configuración de mi sitio MVC!

OnException una pequeña modificación al método OnException para manejar múltiples instancias de HandleErrorAttribute , como lo sugiere Atif Aziz:

tenga en cuenta que puede tener que tener cuidado de que si hay varias instancias de HandleErrorAttribute en vigencia, entonces el registro duplicado no ocurre.

Simplemente compruebo context.ExceptionHandled antes de invocar la clase base, solo para saber si alguien más manejó la excepción antes del controlador actual.
Funciona para mí y publico el código en caso de que alguien más lo necesite y para preguntar si alguien sabe si pasé por alto algo.

Espero que sea útil:

public override void OnException(ExceptionContext context)
{
    bool exceptionHandledByPreviousHandler = context.ExceptionHandled;

    base.OnException(context);

    Exception e = context.Exception;
    if (exceptionHandledByPreviousHandler
        || !context.ExceptionHandled  // if unhandled, will be logged anyhow
        || RaiseErrorSignal(e)        // prefer signaling, if possible
        || IsFiltered(context))       // filtered?
        return;

    LogException(e);
}



Puede tomar el código anterior e ir un paso más allá al introducir una fábrica de controladores personalizada que inyecta el atributo HandleErrorWithElmah en cada controlador.

Para obtener más información, consulte mi serie de blog sobre cómo iniciar sesión en MVC. El primer artículo cubre cómo configurar Elmah para MVC.

Hay un enlace al código descargable al final del artículo. Espero que ayude.

http://dotnetdarren.wordpress.com/






Related