webapi 2全局异常处理,controller-context为null

时间:2016-08-14 18:10:40

标签: c# error-handling asp.net-web-api2

在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变量显示为空。

任何指针为什么会如此?

1 个答案:

答案 0 :(得分:4)

假定从动作方法中引发了异常。

请确保从true的{​​{1}}方法返回ShouldHandle
否则,ExceptionHandler方法中的context.ExceptionContext.ControllerContext将为空。

由于某些原因,Handle始终为null, 但可以通过context.ExceptionContext.ActionContext的{​​{1}}属性从HttpControllerContext检索到它。

Controller

如果您只关心异常日志记录,则首选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
参见MSDN

  

异常记录器是查看Web API捕获的所有未处理异常的解决方案。
  即使我们要中止异常记录器,总是会调用异常记录器   连接。
  异常处理程序仅在我们仍然有能力时才被调用   选择要发送的响应消息。

此外,如上所述,从ExceptionHandler中检索HttpActionContext