在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
}
}
上面的 controller
和action
变量显示为空。
任何指针为什么会如此?
答案 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
。