【问题标题】:Autofac (WebApi) IAutofacExceptionFilter OnException called twiceAutofac (WebApi) IAutofacExceptionFilter OnException 调用了两次
【发布时间】:2013-12-03 14:01:56
【问题描述】:

我在为 web api 使用 autofac 时遇到问题。我有一个自定义的 ExceptionFilterAttribute 覆盖 OnException 以记录和处理可能发生的任何异常。 ExceptionFilterAttribute 应用于一个 ApiController 类。

过滤代码如下:

public class ExceptionFilterAttribute : ExceptionFilterAttribute, IAutofacExceptionFilter
{
    private ILogger _logger;

    public ExceptionFilterAttribute()
    {

    }

    public ExceptionFilterAttribute(ILogger logger)
    {
        _logger = logger;
    }

    public override void OnException(HttpActionExecutedContext context)
    {
        // Removed for brevity
    }
}

在 autofac 配置中,有很多注册的类型,我从下面删除了它们相似的地方:

var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<ReflectionClassReader>().As<IClassReader>();
builder.RegisterType<Logger>().As<ILogger>();

builder.RegisterModule<DataModule>();

builder.Register(c => new ExceptionFilterAttribute(c.Resolve<ILogger>()))
       .AsWebApiExceptionFilterFor<ApiController>().SingleInstance();

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

var container = builder.Build();
configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

当异常被抛出并冒泡到 ApiController 时,ExceptionFilterAttribute.OnException 方法会被调用两次。第一次调用时,_logger 被 Autofac 正确填充;第二,_logger 为空。

我无法弄清楚为什么这会被调用两次。我调试时没有堆栈跟踪,因为它是一个属性。

我只能假设由于我已经完成了一些 autofac 配置,它被调用了两次,但我完全被卡住了。我已经尝试根据我在网上找到的一些示例更改配置顺序,但无济于事。

我发现的关于使用 IAutofacExceptionFilter 和 webapi 的唯一真实信息是 http://alexmg.com/post/2012/09/01/New-features-in-the-Autofac-MVC-4-and-Web-API-%28Beta%29-Integrations

有人有什么想法吗?非常感谢!

【问题讨论】:

    标签: c# dependency-injection asp.net-web-api autofac filterattribute


    【解决方案1】:

    尝试删除线。

    builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
    

    我认为这会导致注册异常过滤器两次。如果您有其他需要注册的过滤器,则选择不多

    一个。尝试仅使用 AutoFac 构建器来注册这些过滤器。我的意思是只使用一种机制寄存器过滤器。

    b.创建CustomFilter Provider,如果它们被重复等,您可以删除/添加过滤器。(网上有很多例子,但超出了这个问题的范围)

    【讨论】:

      【解决方案2】:

      认为这里的问题是您同时使用属性和过滤器。 so 会因为该属性而在后台被 api 调用,这将是一个空记录器,然后通过过滤器注册再次由 autofac 调用,并且它将填充由 autofac 创建的记录器

      尝试将课程更新为此

      public class ExceptionFilterAttribute : IAutofacExceptionFilter
      

      删除ExceptionFilterAttribute,

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-25
        • 2013-01-21
        • 2012-09-08
        • 2016-04-27
        • 2019-02-27
        • 1970-01-01
        • 2019-12-04
        相关资源
        最近更新 更多