asp.net-mvc – 使用ASP.New MVC 4 Web Api进行授权过滤依赖注入
发布时间:2020-12-16 09:54:11 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试在MVC 4 Web Api授权过滤器上实现依赖注入.我创建了一个继承自ActionDescriptorFilterProvider的FilterProvider: public class UnityWebApiFilterAttributeFilterProvider : ActionDescriptorFilterProvider,System.Web.Http.Filters.IFilterProv
我正在尝试在MVC 4 Web Api授权过滤器上实现依赖注入.我创建了一个继承自ActionDescriptorFilterProvider的FilterProvider:
public class UnityWebApiFilterAttributeFilterProvider : ActionDescriptorFilterProvider,System.Web.Http.Filters.IFilterProvider { private readonly IUnityContainer _container; public UnityWebApiFilterAttributeFilterProvider(IUnityContainer container) { _container = container; } public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration,HttpActionDescriptor actionDescriptor) { var filters = base.GetFilters(configuration,actionDescriptor); this.BuildUpAttributes(filters); return filters; } private void BuildUpAttributes(IEnumerable filterInfo) { foreach (FilterInfo filter in filterInfo) { object o = _container.BuildUp(filter.GetType(),filter); } } } 我将此提供程序设置为我的Global.asax文件中的默认提供程序: var providers = GlobalConfiguration.Configuration.Services.GetFilterProviders().ToList(); //Remove the default provider var defaultprovider = providers.Single(i => i is ActionDescriptorFilterProvider); GlobalConfiguration.Configuration.Services.Remove(typeof(System.Web.Http.Filters.IFilterProvider),defaultprovider); //Add our custom provider GlobalConfiguration.Configuration.Services.Add(typeof(System.Web.Http.Filters.IFilterProvider),new UnityWebApiFilterAttributeFilterProvider(new UnityContainer())); 我还在AuthorizationFilter中添加了一个依赖项: public class WebApplicationApiAuthorizeAttribute : System.Web.Http.AuthorizeAttribute { [Dependency] public IAuthorizationHelper AuthorizationHelper { get; set; } #region OnAuthorization public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) { //Authorization code,which uses the AuthorizationHelper lives here } } 我在Unity配置文件中设置了一个映射: container.RegisterType<WebApplicationApiAuthorizeAttribute>(new InjectionMember[] { new InjectionProperty("AuthorizationHelper",new ResolvedParameter<IAuthorizationHelper>()) }); container.RegisterType<IAuthorizationHelper,WebAuthorizationHelper>(new InjectionMember[] { new InjectionProperty("Cache",new ResolvedParameter<ICache>(cacheType)),new InjectionProperty("UserSessionManager",new ResolvedParameter<IUserSessionManager>()),new InjectionProperty("AuthorizationPermissionManager",new ResolvedParameter<IAuthorizationPermissionManager>()),new InjectionProperty("ExceptionLogger",new ResolvedParameter<IExceptionLogger>()),}); 我可以看到UnityWebApiFilterAttributeFilterProvider类中的“BuildUpAttributes”方法已执行,并且过滤器已传递到_container.BuildUp(…)方法,但是,WebApplicationApiAuthorizeAttribute中的“IAuthorizationHelper”依赖关系无法解析.当我调试WebApplicationApiAuthorizeAttribute时,它为null. 那么为什么这种依赖性没有被解决? 解决方法
您的代码中有两个错误.
>您正在构建FilterInfo对象而不是其Instance: foreach (FilterInfo filter in filterInfo) { object o = _container.BuildUp(filter.GetType(),filter); } 但这是正确的代码: foreach (FilterInfo filter in filterInfo) { _container.BuildUp(filter.Instance.GetType(),filter.Instance); } >您的自定义UnityWebApiFilterAttributeFilterProvider获取一个新的空容器: GlobalConfiguration.Configuration.Services.Add( typeof(System.Web.Http.Filters.IFilterProvider),new UnityWebApiFilterAttributeFilterProvider(new UnityContainer())); 但是你应该传递应用程序配置的容器: GlobalConfiguration.Configuration.Services.Add( typeof(System.Web.Http.Filters.IFilterProvider),new UnityWebApiFilterAttributeFilterProvider(container)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – 目的是什么?
- 如何在ASP.Net Core 2.0应用程序中使用Bootstrap?
- 哪些ASP.NET生命周期事件在HttpApplication.Error之后发生?
- 用asp.net core 2.0 + EFCore.Sqlite做个小网站
- ASP.NET剃刀参考文档
- asp.net-mvc – 最新的ASP.Net MVC 3请求处理管道图?
- 单元测试 – 自动混合和WebApi控制器
- 如何在ASP.NET中使用列表<>集合作为Repeater数据源与C#
- asp.net-mvc – enable-migrations错误:项目无法构建
- 我可以使用ASP.NET获得“WAR文件”类型部署吗?
推荐文章
站长推荐
- asp.net核心 – aspnetcidev和aspnetvnext之间的
- asp.net – RegisterStartupScript和执行顺序
- asp.net – 将Dot Net网站调试为域普通用户
- asp.net-mvc – ASP.NET MVC3视图授权设计
- asp.net中使用repeater和PageDataSource搭配实现
- ASP.NET:跨应用程序的表单身份验证:匹配密码加
- asp.net-mvc – 在需要时在CQRS中提供同步行为?
- asp.net-mvc – 数据注释 – 如何用MVC3中的Web.
- ASP.NET Core集成现有系统认证
- asp.net-mvc – Asp mvc 3 noobie:为什么代码优
热点阅读