ASP.NET Core中使用ServiceFilter调用自定义IAsyncActionFilter时出现服务未注册异常的问题
ASP.NET Core中使用ServiceFilter调用自定义IAsyncActionFilter时出现服务未注册异常的问题
嗨,我来帮你搞定这个报错!你遇到的System.InvalidOperationException: No service for type 'MyProject.Attributes.ValidateApiKeyAttribute' has been registered错误,核心原因很明确:你用了[ServiceFilter]来引用自定义过滤器,但没有把这个过滤器本身注册到依赖注入(DI)容器里。
问题拆解
你现在的代码里,虽然在Program.cs中注册了ILogService<>,也尝试给控制器添加了全局过滤器,但ServiceFilterAttribute的工作机制是从DI容器中获取过滤器实例,而不是直接创建新实例。你的ValidateApiKeyAttribute有构造函数依赖(ILogService<ValidateApiKeyAttribute>),而且你用了ServiceFilter,就必须把它本身注册为DI服务,不然ASP.NET Core找不到它。
解决方案
只需要在Program.cs中添加一行代码,把你的自定义过滤器注册为Scoped服务(和你的ILogService生命周期保持一致):
builder.Services.AddScoped(typeof(ILogService<>), typeof(LogService<>)); // 新增这行:将ValidateApiKeyAttribute注册到DI容器 builder.Services.AddScoped<ValidateApiKeyAttribute>(); builder.Services.AddControllersWithViews(); // 注意:如果你不需要全局应用这个过滤器,建议去掉下面这行 // 因为你是通过[ServiceFilter]按需给特定接口添加验证的,全局添加可能会导致不必要的验证 // options.Filters.Add<ValidateApiKeyAttribute>();
额外说明
- 如果你之前的
options.Filters.Add<ValidateApiKeyAttribute>()是想全局启用验证,那这个写法本身有问题:因为这种方式会直接实例化过滤器,而你的过滤器有构造函数依赖,ASP.NET Core无法自动注入ILogService,所以即使没有ServiceFilter的问题,全局添加这行也会报错。如果要全局用带依赖的过滤器,应该用options.Filters.AddService<ValidateApiKeyAttribute>(),这样会从DI获取实例,但前提也是要先把过滤器注册到DI。 - 你当前的场景是按需给特定接口添加验证,所以用
[ServiceFilter(typeof(ValidateApiKeyAttribute))]是正确的,只要确保过滤器已注册到DI即可。
验证修正
修改后重新编译运行,调用你的/groups接口时,ASP.NET Core就能从DI容器中拿到ValidateApiKeyAttribute的实例,并正确注入ILogService,不会再报服务未注册的错误了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

