2012-04-08 19 views
12

Al utilizar un controlador API en MVC4, cuando la acción del controlador arroja una excepción, ELMAH no registra el error.Controlador ELMAH y API en MVC4 no registra errores

Creo que el problema es que MVC4 establece el código de estado HTTP en 500 y devuelve los detalles de la excepción en un objeto JSON, pero no lanza una excepción no controlada para que ELMAH nunca lo vea.

¿Cómo puedo obtener ELMAH para capturar todas las respuestas donde el código de estado no es 200?

+3

Es probablemente la pena señalar que los controladores de la API están en Web API, no MVC. Las rutas de ejecución separadas para cada uno a menudo son la causa de la incompatibilidad de una biblioteca dirigida a MVC con la API web. Cada solicitud va MVC o va API web. Los dos están uno al lado del otro y no interactúan (Web API no es una función dentro de la ejecución de MVC). Tienen diferentes contextos, diferentes tablas de rutas, diferentes configuraciones, todas diferentes, todas separadas. – StarTrekRedneck

Respuesta

22

El antecomedor descrito anteriormente no funciona. He intentado en mi servidor de prueba y ha recibido un error ("La instancia de filtro dado debe implementar una o más de las siguientes interfaces de filtro:. IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter")

Entonces me di cuenta de lo que pasó .. .. usted está tratando de agregar el filtro personalizado al filtro global MVC (filters.Add (nueva ElmahHandledErrorLoggerFilter());)

para solucionar esto, he dividido el registro de filtro en GlobalFilter y HTTPFilter

FilterConfig.cs

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

    public static void RegisterHttpFilters(HttpFilterCollection filters) 
    { 
     filters.Add(new ElmahHandledErrorLoggerFilter()); 
    } 

Global.asax

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    FilterConfig.RegisterHttpFilters(GlobalConfiguration.Configuration.Filters); 

;-)

+0

Esto funcionó, gracias. – jhilden

+2

Con el andamiaje actual de la API web, el filtro debe registrarse en App_Start/WebApiConfig.cs. config.Filters.Add (new ElmahExceptionFilter()); –

+0

Acabo de instalar vía nuget Elmah.MVC. Muy fácil de poner en marcha, pero no registrando 500 errores. Entiendo la respuesta anterior, pero no veo el ElmahHandledErrorLoggerFilter (que se muestra en el fragmento de código anterior) en mis espacios Elmah. * O Elmah.Mvc. * EDIT: ¡ay! Ahora veo ... es una clase que escribes tú mismo .. y se muestra en el fragmento de código de OP. ¡Lo siento! ;) – bkwdesign

16

ACTUALIZACIÓN: Esta respuesta no funciona en las últimas versiones. Usa la respuesta de julianox

respuesta encontrado partir de la información aquí: http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling

Cuando los registros de filtro excepción a ELMAH:

public class ElmahHandledErrorLoggerFilter : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext actionExecutedContext) 
    { 
     base.OnException(actionExecutedContext); 

     ErrorSignal.FromCurrentContext().Raise(actionExecutedContext.Exception); 
    } 
} 

pero también hay que añadir el filtro de error a los filtros GlobalConfiguration:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     GlobalConfiguration.Configuration.Filters.Add(new ElmahHandledErrorLoggerFilter()); 
     filters.Add(new ElmahHandledErrorLoggerFilter()); 
     filters.Add(new HandleErrorAttribute()); 
    } 
+0

cosas geniales. Luché con esto y no agregué el filtro Elmah a GlobalConfiguration. –

+1

Cuando hice esto, no funcionó en absoluto a menos que agregue GlobalConfiguration.Configuration.Filters.Add (new ElmahHandledErrorLoggerFilter()); en el método RegisterGlobalFilters. ¿No deberían los filtros. Agregar (nuevo ElmahHandledErrorLoggerFilter()); línea lo ha hecho? ¿De qué sirve tener ambas cosas? – JustinP8

+0

@ JustinP8 WebApi ha recreado casi por completo algunas de las cosas que ya estaban en MVC. Aunque esto es frustrante, puede ver que WebApi y MVC son caracteres diferentes: una interfaz de usuario orientada a otro software orientado. Si revisa los tipos devueltos por GlobalConfiguration.Configuration.Filters (HttpFilterCollection) y GlobalFilters.Filters (GlobalFilterCollection) puede ver que son bestias diferentes. – WooWaaBob