ABP自动API控制器无法绑定自定义Attribute问题排查
问题背景
自定义了实现IAuthorizationFilter、IFilterFactory和IScopedDependency的OrganizationPlayerOnlyAttribute,将其标记在手动编写的Controller方法上时可以正常触发,但标记在AppService方法上时,ABP自动生成的API控制器并未触发该过滤器。当前自动控制器配置代码如下:
Configure<AbpAspNetCoreMvcOptions>(options => { options.ConventionalControllers.Create(typeof(MainStageApplicationModule).Assembly); });
自定义Attribute代码:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true)] public class OrganizationPlayerOnlyAttribute : Attribute, IAuthorizationFilter, IFilterFactory, IScopedDependency { public ICurrentUser _currentUser; public IMemberAppService _memberAppService; public bool IsReusable => false; public IFilterMetadata CreateInstance(IServiceProvider serviceProvider) { _currentUser = serviceProvider.GetRequiredService<ICurrentUser>(); _memberAppService = serviceProvider.GetRequiredService<IMemberAppService>(); return ActivatorUtilities .GetServiceOrCreateInstance<OrganizationPlayerOnlyAttribute>(serviceProvider); } public void OnAuthorization(AuthorizationFilterContext context) { throw new NotImplementedException(); } }
AppService示例代码:
public class MyAccountAppService : AccountAppService, IDisambiguatorAppService { [OrganizationPlayerOnly] public Task Test() { return Task.CompletedTask; } }
解决方案
ABP的常规控制器(自动生成的API控制器)默认不会自动将AppService上的过滤器Attribute同步到生成的控制器代理类中,需要显式配置过滤器约定来实现这一点。
方法1:直接添加指定过滤器
修改自动控制器配置,通过WithFilters将自定义过滤器添加到常规控制器的过滤器集合中:
Configure<AbpAspNetCoreMvcOptions>(options => { options.ConventionalControllers .Create(typeof(MainStageApplicationModule).Assembly) .WithFilters(filters => { filters.Add<OrganizationPlayerOnlyAttribute>(); }); });
方法2:自动继承AppService上的所有过滤器
如果希望自动应用AppService上标记的所有过滤器,可以启用AddControllersAsServices,让自动生成的控制器以服务方式注册,从而自动继承原AppService的过滤器:
Configure<AbpAspNetCoreMvcOptions>(options => { options.ConventionalControllers .Create(typeof(MainStageApplicationModule).Assembly) .WithFilters(filters => { filters.AddControllersAsServices(); }); });
额外注意事项
- 确保
OrganizationPlayerOnlyAttribute的AttributeUsage已正确设置为支持方法和类级别(当前代码已满足)。 - 确认
OrganizationPlayerOnlyAttribute的依赖注入配置正确,因为它实现了IScopedDependency,ABP会自动处理其生命周期。
内容的提问来源于stack exchange,提问作者Mainumbi
相关产品推荐
相关产品推荐

