Webapi 2全局异常处理,controller-context为空

本文关键字:controller-context 为空 异常处理 全局 Webapi | 更新日期: 2023-09-27 18:02:18

在WebAPI 2全局异常处理程序中,我试图从抛出错误的地方获得控制器对象的引用。

是它的代码:

public class CustomExceptionHandler : ExceptionHandler
{
     public override void Handle(ExceptionHandlerContext context)
     {
         var controller = context.ExceptionContext.ControllerContext;
         var action = context.ExceptionContext.ActionContext;
         //.....some code after this
     }
}

上述controlleraction变量结果为空

为什么?

Webapi 2全局异常处理,controller-context为空

假设异常是从操作方法中抛出的

确保从ExceptionHandlerShouldHandle方法返回true
否则,Handle方法中的context.ExceptionContext.ControllerContext将为空。

由于某些原因context.ExceptionContext.ActionContext总是空的,但是这个可以通过它的Controller属性从HttpControllerContext中检索。

class MyExceptionHandler : ExceptionHandler
{
    public override void Handle(ExceptionHandlerContext context)
    {            
        HttpControllerContext controllerContext = context.ExceptionContext.ControllerContext;            
        if (controllerContext != null)
        {
            System.Web.Http.ApiController apiController = controllerContext.Controller as ApiController;
            if (apiController != null)
            {
                HttpActionContext actionContext = apiController.ActionContext;
                // ...
            }
         }
         // ...
         base.Handle(context);
    }
    public override Boolean ShouldHandle(ExceptionHandlerContext context)
    {
        return true;
    }            
}

如果您只关心异常日志记录,请选择ExceptionLogger而不是ExceptionHandler
看到MSDN。

异常日志器是查看Web API捕获的所有未处理异常的解决方案。
异常日志记录器总是被调用,即使我们准备中止连接。
异常处理程序只会在我们还可以的时候被调用选择要发送的响应消息。

这里也可以从上面所示的HttpControllerContext中检索HttpActionContext