1

У меня возникла проблема с использованием autofac для web api. У меня есть специальный ExceptionFilterAttribute, который переопределяет OnException для регистрации и обработки любых исключений, которые могут возникнуть. ExceptionFilterAttribute применяется к одному классу ApiController.Autofac (WebApi) IAutofacExceptionFilter OnException вызывает дважды

Код фильтра, как показано ниже:

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.

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

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

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

Есть идеи? Большое спасибо!

ответ

0

Попробуйте удалить линию.

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); 

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

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

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

Смежные вопросы