【问题标题】:webapi 2 global exception handling, controller-context is nullwebapi 2 全局异常处理,控制器上下文为空
【发布时间】:2016-08-14 18:10:40
【问题描述】:

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

任何指针为什么会这样?

【问题讨论】:

  • 在控制器解决之前出现错误怎么办?给我们看一些代码。
  • 如果现在清楚请告诉我。
  • 在到达控制器之前您可能会遇到错误。
  • @alltej :不是这样,因为我已经在控制器操作中明确写了一个 throw 语句,从那里它转到上面提到的异常处理程序。

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


【解决方案1】:

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

确保从您的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,如上所示。

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2020-01-18
    • 2017-10-12
    • 1970-01-01
    • 2016-11-03
    相关资源
    最近更新 更多