Autofac (WebApi) IAutofacExceptionFilter OnException вызывается дважды

У меня проблема с использованием autofac для веб-API. У меня есть собственный 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 имеет значение null.

Я не могу понять, почему это вызывается дважды. При отладке нет трассировки стека, поскольку это атрибут.

Я могу только предположить, что он вызывается дважды из-за какой-то конфигурации autofac, которую я сделал, но я полностью застрял. Я пытался изменить порядок конфигурации в соответствии с некоторыми примерами, которые я нашел в Интернете, но безрезультатно.

Единственная реальная информация, которую я нашел об использовании IAutofacExceptionFilter с webapi, была на http://alexmg.com/post/2012/09/01/New-features-in-the-Autofac-MVC-4-и-Web-API-%28Beta%29-Integrations.

У кого-нибудь есть идеи? Большое спасибо!


person Loki    schedule 03.12.2013    source источник


Ответы (2)


Попробуйте удалить строку.

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);

Я думаю, что происходит, это заставляет дважды регистрировать фильтр исключений. Если у вас есть другие фильтры, которые необходимо зарегистрировать, у вас есть несколько вариантов

а. Попробуйте использовать только AutoFac Builder для регистрации этих фильтров. Я имею в виду использование только одного механизма регистрации фильтров.

б. Создайте CustomFilter Provider которые вы можете удалить / добавить фильтры, если они были продублированы и т. д. (в Интернете есть много примеров, но они выходят за рамки этого вопроса)

person Spock    schedule 04.12.2013

думаю, проблема в том, что вы используете атрибут и фильтр одновременно. поэтому будет вызван API под капотом из-за атрибута, и это будет нулевой регистратор, а затем снова с помощью autofac через регистрацию фильтра, и это заполнит регистратор, поскольку он был создан autofac

попробуйте обновить класс до этого

public class ExceptionFilterAttribute : IAutofacExceptionFilter

удаление ExceptionFilterAttribute,

person workabyte    schedule 28.07.2020