AspNetCoreRateLimit .NET Core 3.0 - 无法解析参数 IMemoryCache 缓存

Posted

技术标签:

【中文标题】AspNetCoreRateLimit .NET Core 3.0 - 无法解析参数 IMemoryCache 缓存【英文标题】:AspNetCoreRateLimit .NET Core 3.0 - Cannot resolve parameter IMemoryCache cache 【发布时间】:2020-05-29 21:53:43 【问题描述】:

自从切换到 .NET Core 3.0 和 3.1 后,我在应用程序/API 启动时收到以下 AspNetCoreRateLimit 错误:

“AspNetCoreRateLimit.MemoryCacheRateLimitCounterStore”类型上的“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”可以使用可用的服务和参数调用: 无法解析构造函数“Void .ctor(Microsoft.Extensions.Caching.Memory.IMemoryCache)”的参数“Microsoft.Extensions.Caching.Memory.IMemoryCache cache”。

我的服务配置是这样的:

services.AddControllers();

        services.AddApiVersioning(options =>
        
            options.ReportApiVersions = true;
            options.ApiVersionReader = new UrlSegmentApiVersionReader();
        )
        .AddVersionedApiExplorer(options =>
        
            options.GroupNameFormat = "'v'VVV";
            options.SubstituteApiVersionInUrl = true;
        )

        // Register the Swagger generation with the default options
        .AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>()
        .AddSwaggerGen(options =>
        
            options.OperationFilter<SwaggerDefaultValues>();
            options.CustomSchemaIds(x => x.FullName);
        );

        services.AddCors();

        //add API throttling configuration
        services.Configure<CView.Core.Web.Settings.IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"))
            .AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>()
            .AddSingleton<IMemoryCache, MemoryCache>()
            .AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>()
            .AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>()
            .AddResponseCompression()
            .Configure<ExceptionHandlingOptions>(Configuration.GetSection("ExceptionHandlingOptions"))
            .Configure<ApiBehaviorOptions>(opt =>  opt.SuppressModelStateInvalidFilter = true; )
            .Configure<RabbitMqMessageBus>(GetRabbitMqConfigurationSection())
            .AddMassTransit(x =>
            
                x.AddBus(ConfigureRabbitMq);
                x.AddConsumer<CompanyNameUpdatedConsumer>();
            );

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

        services.AddSingleton<IHostedService, RabbitMqHostedService>();
        services.AddAutoMapper(Assembly.GetAssembly(typeof(AutoMapperModule))); //If you have other mapping profiles defined, that profiles will be loaded too.
        services.Configure<Auth0Options>(Configuration.GetSection("Auth0"));

        var auth0Domain = $"Configuration["Auth0:Domain"]";

        services.AddAuthentication(options =>
        
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        ).AddJwtBearer(options =>
        
            options.Authority = auth0Domain;
            options.Audience = Configuration["Auth0:Audience"];
        );

我知道错误是说它无法解决依赖 IMemoryCache 并且通过将以下内容添加到启动中我能够摆脱它:

services.AddSingleton<IMemoryCache, MemoryCache>()

但我担心的是,这在早期版本的 .NET Core 中并没有发生,它不在任何 AspNetCoreRateLimit 文档中,而且我真的不知道简单地添加注入 MemoryCache 的含义!

谁能帮我弄清楚我遗漏了什么/做错了什么以及为什么在新版本的 .NET Core 中开始出现这种情况,但只在 .NET Core 2.1 中有效?

【问题讨论】:

你能列出 ConfigService 部分的代码吗? service.AddXYZ 部分将在 DI 中注入服务。我假设在 2.0 内部升级到 3.0 时删除了这种注入。顺便说一句,你可以使用 services.AddMemeryCache() 代替手动配置 IMemeryCache 注入。 我已经更新了我的问题以包含我的配置代码。 这些看起来是您的自定义注入,您还有其他添加部分吗?像 addauthention,addcookies 之类的东西?一些内置的 addxyz 会注入内存缓存,并且可能会对那些导致 2.1 有效但 3.0 无效的部分进行一些更改 我已经添加了我拥有的所有服务注册代码(添加授权策略除外)。不确定这是否有帮助! 【参考方案1】:

您在此处向管道添加IRateLimitCounterStore

.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>()

您可以从the source 看到MemoryCacheRateLimitCounterStore 类在其构造函数中采用IMemoryCache

public MemoryCacheRateLimitCounterStore(IMemoryCache cache) : base(cache)


如果您不向管道提供IMemoryCache,则无法通过 DI 构造此类(这就是错误告诉您的内容)。

查看源文件的历史记录,它似乎总是需要向其构造函数提供该参数。也许,在 2.1 版中,其他一些服务在幕后添加了 IMemoryCache,但在 3.0 中不再为您添加。

添加内存缓存并没有真正的问题 - 只要您一直在使用MemoryCacheRateLimitCounterStore,它就会一直以某种方式添加。看来你现在只需要自己添加它。

【讨论】:

以上是关于AspNetCoreRateLimit .NET Core 3.0 - 无法解析参数 IMemoryCache 缓存的主要内容,如果未能解决你的问题,请参考以下文章

重新整理 .net core 周边阅读篇————AspNetCoreRateLimit[一]

AspNetCoreRateLimit - ASP.NET Core 速率限制中间件。

尝试激活“AspNetCoreRateLimit.IpRateLimitMiddleware”时无法解析“AspNetCoreRateLimit.IProcessingStrategy”类型的服务

Web API 速率限制(四)- 其它和AspNetCoreRateLimit

.net Core中如何限制接口请求次数

.NET Core WebApi接口ip限流实践