11

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)
            };
        }
    }
}
4

2 回答 2

2

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

throw new HttpResponseException(context.Response);
于 2013-07-04T10:14:41.553 回答
0

Web API 2 在设计时考虑了控制反转。您考虑已经处理异常的可能性,而不是在处理后中断过滤器执行。

从这个意义上说,派生自的属性ExceptionFilterAttribute应该检查是否已经处理了异常,您的代码已经这样做了,因为运算符为值is返回 false 。null另外,在你处理完异常后,你设置context.Exceptionnull是为了避免进一步的处理。

要在您的代码中实现这一点,您需要将您的注释替换为MethodExceptionFilterAttributecontext.Exception = null清除异常。

需要注意的是,由于排序问题,注册多个全局异常过滤器并不是一个好主意。有关 Web API 中属性过滤器的执行顺序的信息,请参阅以下线程Web api 中多个过滤器的执行顺序

于 2019-10-16T19:58:17.503 回答