Asp.net web api ExceptionFilterAttribute不处理属性异常

Asp.net web api ExceptionFilterAttribute不处理属性异常,asp.net-web-api,action-filter,actionfilterattribute,Asp.net Web Api,Action Filter,Actionfilterattribute,我实现了一个ExceptionFilterAttribute类,并将其注册到WebApiConfig类中。 动作过滤器工作正常,可以处理任何动作中发生的任何异常,但问题是:当在任何控制器属性中发生异常时,动作过滤器不会处理该异常 [NotImplExceptionFilterAttribute] public class AnyController : APIController { private readonly ModelDBContext _db = new ModelDBCon

我实现了一个ExceptionFilterAttribute类,并将其注册到WebApiConfig类中。 动作过滤器工作正常,可以处理任何动作中发生的任何异常,但问题是:当在任何控制器属性中发生异常时,动作过滤器不会处理该异常

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

    //some actions
}

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

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

首先检查此图: 然后导航到第232行。在那个里你们可以看到,若至少有一个过滤器,那个么它将被用来包装结束动作的结果。 在ExceptionFilterResult内部有一个简单的try-catch,若抛出异常,则调用所有注册的异常筛选器。 因此,以上所有内容的简短总结如下: 1) 异常过滤器不负责处理控制器操作以上的错误 2) 在DI容器创建控制器实例以及ModelDBContext引发异常时,异常筛选器不存在

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

    //some actions
}
我希望这能回答你的问题。

问题在于范围

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

因此,操作筛选器不会捕获在控制器对象的构造/初始化过程中发生的异常,例如未能构造
ModelDBContext
实例

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

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