Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exception filter not working in web api

I have a custom exception filter capable handle all the errors in the controller( just a common error handling mechanism) ,

public class ExceptionHandlingAttribute : ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext actionExecutedContext)
        {
            var error = actionExecutedContext.Exception;
            if (error is BussinessExcetion)
            {
                var exceptionBase = (BussinessExcetion)error;
                var code = (HttpStatusCode)exceptionBase.HttpExceptionCode;
                throw new HttpResponseException(new HttpResponseMessage(code)
                                                    {
                                                        Content = new StringContent(exceptionBase.Message),
                                                        ReasonPhrase = "Exception"

                                                        ,
                                                    });

            }

            // Now log the error

            /* Error logging */

            LoggingFactory.GetLogger().LogError(string.Format("Exception:{0} ||Stack trace:{1}", error.Message, error.StackTrace), error);



            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
                                                {
                                                    Content = new StringContent("An error occurred, contact the support team."),
                                                    ReasonPhrase = "Critical Exception"
                                                });
        }
    }

I registered this filter in fillterConfig file

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

    }

but i am getting an error

The given filter instance must implement one or more of the following filter interfaces: IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter

I know the ExceptionFilterAttribute already implimented IExceptionFilter filter. Why i am getting this error

like image 754
Binson Eldhose Avatar asked Feb 01 '14 04:02

Binson Eldhose


People also ask

How many ways can you handle exceptions in Web API?

In ASP.NET MVC Web API, we usually have three ways to handle exceptions, HttpResponseException, associated with HttpStatusCode, --- Locally in Try-catch-final. Exception filter, --- in the level of Action, Controller, and Globally.

How do I add filters to Web API?

Like other filters, authentication filters can be applied per-controller, per-action, or globally to all Web API controllers. To apply an authentication filter to a controller, decorate the controller class with the filter attribute.


2 Answers

In order for this to work, you need to implement System.Web.Http.Filters.ExceptionFilterAttribute.

public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute
{
    log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    public override void OnException(HttpActionExecutedContext context)
    {
        RequestData requestData = new RequestData(context.Request);

        log.Error("NotImplExceptionFilterAttribute", context.Exception);
            context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
    }
}

Then, in your WebApiConfig.cs, register the filter:

public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{count}",
            defaults: new { count = RouteParameter.Optional }
        );

        config.Filters.Add(new NotImplExceptionFilterAttribute());
    }
like image 102
thebiggestlebowski Avatar answered Sep 22 '22 03:09

thebiggestlebowski


And for anyone using NLog:

public class NlogExceptionFilter : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext filterContext)
    {
        Exception lastException = filterContext.Exception;
        Logger logger = LogManager.GetLogger("");
        logger.Fatal(lastException.Message, lastException);
    }
}

And in the WebApiConfig.cs

public static void Register(HttpConfiguration config)
{
    config.Filters.Add(new NlogExceptionFilter());
    ...
}
like image 25
Fordy Avatar answered Sep 25 '22 03:09

Fordy