设置Web API ExceptionFilterAttribute中处理的异常

时间:2013-05-08 13:24:33

标签: asp.net asp.net-web-api

ASP.NET Web API中是否有任何方法可以将异常标记为ExceptionFilterAttribute中的处理?

我想在方法级别使用异常过滤器处理异常,并停止传播到全局注册的异常过滤器。

控制器操作上使用的过滤器:

public class MethodExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is NotImplementedException)
        {
            context.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
            {
                Content = new StringContent(context.Exception.Message)
            };
            // here in MVC you could set context.ExceptionHandled = true;
        }
    }
}

全球注册过滤器:

public class GlobalExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is SomeOtherException)
        {
            context.Response = new HttpResponseMessage(HttpStatusCode.SomethingElse)
            {
                Content = new StringContent(context.Exception.Message)
            };
        }
    }
}

2 个答案:

答案 0 :(得分:2)

尝试在本地处理结束时抛出HttpResponseException。按照设计,它们不会被异常过滤器捕获。

throw new HttpResponseException(context.Response);

答案 1 :(得分:0)

Web API 2在设计时考虑了inversion of control。您认为可能已经处理了异常,而不是在处理之后中断过滤器的执行。

从这个意义上说,从ExceptionFilterAttribute派生的属性应该检查异常是否已经处理,因为is运算符对null的值返回false,因此代码已经执行了该操作。另外,在处理异常之后,请将context.Exception设置为null,以避免进一步处理。

要在代码中实现此目的,您需要将MethodExceptionFilterAttribute中的注释替换为context.Exception = null,以清除异常。

需要注意的是,由于顺序问题,注册多个全局异常过滤器不是一个好主意。有关Web API中属性过滤器的执行顺序的信息,请参见以下线程Order of execution with multiple filters in web api