【发布时间】: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