ELMAH and API controller in MVC4 not logging errors

前端 未结 2 825
情书的邮戳
情书的邮戳 2021-02-05 20:09

Using an API controller in MVC4, when the controller action throws an exception, ELMAH does not log the error.

I think the problem is that MVC4 sets the HTTP status code

相关标签:
2条回答
  • 2021-02-05 20:59

    The anwser described before doesn't work. I've tried on my test server and received an error ("The given filter instance must implement one or more of the following filter interfaces: IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter.")

    Then I realized what happened .... you are trying to add the custom filter to the MVC Global Filter (filters.Add(new ElmahHandledErrorLoggerFilter());)

    To fix that, I've split the filter registration in GlobalFilter and 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 讨论(0)
  • 2021-02-05 21:00

    UPDATE: This answer does not work in latest versions. Use julianox's answer.

    Answer found from information here: http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling

    Where the exception filter logs to elmah:

    public class ElmahHandledErrorLoggerFilter : ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext actionExecutedContext)
        {
            base.OnException(actionExecutedContext);
    
            ErrorSignal.FromCurrentContext().Raise(actionExecutedContext.Exception);
        }
    }
    

    but you also have to add the error filter to the GlobalConfiguration filters:

        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            GlobalConfiguration.Configuration.Filters.Add(new ElmahHandledErrorLoggerFilter());
            filters.Add(new ElmahHandledErrorLoggerFilter());
            filters.Add(new HandleErrorAttribute());
        }
    
    0 讨论(0)
提交回复
热议问题