You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 08:48:09