【问题标题】:ExceptionFilterAttribute not handling properties exceptionsExceptionFilterAttribute 不处理属性异常
【发布时间】:2015-05-14 00:44:20
【问题描述】:

我实现了一个 ExceptionFilterAttribute 类,并在 WebApiConfig 类中注册了它。 动作过滤器运行良好,可以处理任何动作中发生的任何异常,但问题是:当在任何控制器属性中发生异常时,动作过滤器不会处理此异常

[NotImplExceptionFilterAttribute]
public class AnyController : APIController
{
    private readonly ModelDBContext _db = new ModelDBContext();

    //some actions
}

在上面提到的例子中,ModelDBContext 的构造函数包含一些可能导致异常的逻辑。 ExceptionFilterAttribute 不会处理此异常。为什么???又该如何处理?

【问题讨论】:

    标签: asp.net-web-api action-filter actionfilterattribute


    【解决方案1】:

    基本上,简单的答案很简单:异常过滤器是操作级过滤器。

    首先检查此图表:http://blogs.msdn.com/b/kiranchalla/archive/2012/05/06/asp-net-mvc4-web-api-stack-diagram-currently-in-development.aspx 然后导航到ApiController,第 232 行。在那里您可以看到,如果至少有一个过滤器,那么ExceptionFilterResult 将用于包装最终操作结果。 在 ExceptionFilterResult 内部有一个简单的 try-catch,如果抛出异常,则调用所有注册的异常过滤器。 所以,上面写的所有内容的简短摘要: 1) 异常过滤器不负责处理控制器动作之上的错误 2)当控制器的实例被DI容器创建并且你的ModelDBContext抛出异常时,异常过滤器不存在

    我希望这能回答你的问题。

    【讨论】:

      【解决方案2】:

      问题在于范围。

      当控制器被实例化时,私有类成员_db 将在任何类方法执行之前初始化。这是 CLR 行为。

      因此,动作过滤器不会捕获在构造/初始化控制器对象期间发生的异常,例如构造 ModelDBContext 实例失败。

      一种解决方案是在每个请求上创建和处置ModelDBContext 实例,如果您打算优雅地处理(或记录)连接故障(无论是到数据库还是后端),有些人可能会认为这是正确的方法。结束服务。)

      您可能还会发现IServiceLocator 和诸如“Unity”或“Ninject”之类的框架很有用,这样您就不会到处“硬编码”new ModelDBContext(); 语句,但这是另一个主题。根本原因是您在操作方法范围之外进行初始化,操作过滤器不会捕获它。

      【讨论】:

        猜你喜欢
        • 2013-05-02
        • 2014-06-10
        • 2019-07-06
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 2012-11-10
        • 2011-09-15
        相关资源
        最近更新 更多