首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >webapi 2全局异常处理,控制器上下文为空。

webapi 2全局异常处理,控制器上下文为空。
EN

Stack Overflow用户
提问于 2016-08-14 18:10:40
回答 1查看 1.5K关注 0票数 10

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

下面是它的代码:

代码语言:javascript
复制
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 变量都是null.

有什么建议吗?为什么?

EN

回答 1

Stack Overflow用户

发布于 2018-06-25 07:48:17

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

确保从您的trueShouldHandle方法返回ExceptionHandler

没有这一点,Handle方法中的Handle将为null。

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

代码语言:javascript
复制
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捕获的所有未处理异常的解决方案。 异常记录器总是会被调用,即使我们要中止连接。 只有当我们仍然能够选择发送哪条响应消息时,才会调用异常处理程序。

这里,也可以从HttpActionContext中检索HttpControllerContext,如上面所示。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38945133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档