asp.net-mvc – Autofac MVC 5 RegisterWebApiFilterProvider导
我有一个简单的MVC应用程序,我正在尝试添加一个异常过滤器.为此,我遵循了我认为适用于Autofac.WebApi2 NuGet包的
Autofac WebAPI Integration documentation.
首先,我创建了异常过滤器: public class ErrorLoggingExceptionFilter : IAutofacExceptionFilter { public void OnException(HttpActionExecutedContext context) { // do something } } 然后我将AutofacControllerConfiguration属性添加到我想要应用异常过滤器的API控制器基类: [AutofacControllerConfiguration] public class ApiControllerBase : ApiController {} 然后我用Autofac注册了异常过滤器: builder.RegisterType<ErrorLoggingExceptionFilter>() .AsWebApiExceptionFilterFor<ApiControllerBase>() .InstancePerApiRequest(); 此时应用程序仍然正常运行,但异常过滤器没有运行,因此我注册了autofac的过滤器提供程序: builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); 一旦添加,我开始得到500’s,出现以下错误:
我没有在这个项目中使用任何元数据,也不知道有关IOverrideFilter的任何信息. 我错过了什么阻止我的异常过滤器工作? 更新&对评论的回应 该项目使用ASP.NET MVC 5.1,使用以下Autofac和WebApi NuGet版本: <package id="Autofac" version="3.2.0" targetFramework="net45" /> <package id="Autofac.Mvc5" version="3.2.0" targetFramework="net45" /> <package id="Autofac.WebApi2" version="3.2.0" targetFramework="net45" /> <package id="Microsoft.AspNet.WebApi" version="5.1.1" targetFramework="net45" /> <package id="Microsoft.AspNet.WebApi.Client" version="5.1.1" targetFramework="net45" /> <package id="Microsoft.AspNet.WebApi.Core" version="5.1.1" targetFramework="net45" /> <package id="Microsoft.AspNet.WebApi.HelpPage" version="5.1.1" targetFramework="net45" /> <package id="Microsoft.AspNet.WebApi.WebHost" version="5.1.1" targetFramework="net45" /> 我看到与Autofac 3.3相同的结果. 事实证明我可以通过只调用RegisterWebApiFilterProvider方法来重现它,所以虽然我整理了一个完整的样本,但我并没有打扰包括上面的异常过滤器.可以在我的Google Drive上找到可用于重现它的示例项目. 作为参考,这是完整的堆栈跟踪: None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'Autofac.Features.Metadata.Meta`1[System.Web.Http.Filters.IOverrideFilter]' can be invoked with the available services and parameters: Cannot resolve parameter 'System.Web.Http.Filters.IOverrideFilter value' of constructor 'Void .ctor(System.Web.Http.Filters.IOverrideFilter,System.Collections.Generic.IDictionary`2[System.String,System.Object])'. at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context,IEnumerable`1 parameters) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) at Autofac.Core.Resolving.InstanceLookup.Execute() at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope,IComponentRegistration registration,IEnumerable`1 parameters) at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() at System.Linq.Buffer`1..ctor(IEnumerable`1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) at Autofac.Features.Collections.CollectionRegistrationSource.<>c__DisplayClass4.<RegistrationsFor>b__0(IComponentContext c,IEnumerable`1 p) at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context,IEnumerable`1 parameters) at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration,IEnumerable`1 parameters) at Autofac.ResolutionExtensions.ResolveService(IComponentContext context,Service service,IEnumerable`1 parameters) at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context,IEnumerable`1 parameters) at Autofac.Integration.WebApi.AutofacWebApiFilterProvider.ResolveControllerScopedOverrideFilter(FilterContext filterContext,String metadataKey) at Autofac.Integration.WebApi.AutofacWebApiFilterProvider.GetFilters(HttpConfiguration configuration,HttpActionDescriptor actionDescriptor) at System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext() at System.Linq.Buffer`1..ctor(IEnumerable`1 source) at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__0.MoveNext() at System.Linq.Buffer`1..ctor(IEnumerable`1 source) at System.Linq.Enumerable.<ReverseIterator>d__a0`1.MoveNext() at System.Web.Http.Controllers.HttpActionDescriptor.<RemoveDuplicates>d__3.MoveNext() at System.Linq.Buffer`1..ctor(IEnumerable`1 source) at System.Linq.Enumerable.<ReverseIterator>d__a0`1.MoveNext() at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) at System.Web.Http.Controllers.HttpActionDescriptor.InitializeFilterPipeline() at System.Lazy`1.CreateValue() at System.Lazy`1.LazyInitValue() at System.Web.Http.Controllers.HttpActionDescriptor.GetFilterPipeline() at System.Web.Http.Controllers.HttpActionDescriptor.GetFilterGrouping() at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext,CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request,CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext() 解决方法
我会说这是
bug?或至少两个Autofac功能之间的意外干扰.
所以这就是发生的事情: >因为您在示例中使用AnyConcreteTypeNotAlreadyRegisteredSource,Autofac会尝试注册并解析未在控制器中注册的所有类型 此问题有多种解决方法: >只是不要使用AnyConcreteTypeNotAlreadyRegisteredSource,尽管这可能不是你想要做的. builder.OverrideWebApiActionFilterFor<SomeController>(); 所以容器将包含Meta< IOverrideFilter>因此AnyConcreteTypeNotAlreadyRegisteredSource不会针对此类型运行.再次,如果您没有要覆盖的过滤器,这不是一个好的解决方案. builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource( t => !(t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Meta<>)))); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – Visual Studio 2013格式文档在MVC中将属性转
- 如何使用AutoMapper将多个OBJECTS映射到一个对象 – asp.ne
- asp.net – jQuery弹出窗口返回父级的值
- asp.net – 使用GhostScript将PDF转换为服务器上的图像集合
- asp.net – Asp Button悬停和CSS
- asp.net – 如何提取与Outlook正在显示的employeeID属性值相
- asp.net-mvc – 在IISExpress上通过计算机名访问ASP.net we
- ASP.NET随机丢失会话值
- asp.net – 什么是嵌入网站的好搜索引擎
- asp.net-mvc-3 – 从ASP MVC 3 Preview更新到Beta后,提交了
- 从asp.net迁移到php
- 什么是ASP.NET的最佳/推荐的CAPTCHA组件
- asp.net-mvc – 依赖注入和ASP.Net成员提供程序
- asp.net – 浏览器关闭后的身份验证/会话cookie删
- 在asp.net MVC2中的每个Web请求上创建的nhiberna
- asp.net-mvc – 具有服务层和存储库层的ASP.NET
- 从头编写 asp.net core 2.0 web api 基础框架
- ASP.NET(MVC)Outputcache和并发请求
- asp.net-membership – 泛型和ASP.Net成员资格提
- asp.net-mvc-4 – 无法解析类型名称:Glass.Mapp