AspNetCoreRateLimit .NET Core 3.0 - 无法解析参数 IMemoryCache 缓存
AspNetCoreRateLimit .NET Core 3.0 - Cannot resolve parameter IMemoryCache cache
自从切换到 .NET Core 3.0 和 3.1 后,我在 application/API 启动时遇到以下 AspNetCoreRateLimit 错误:
'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'AspNetCoreRateLimit.MemoryCacheRateLimitCounterStore' can be invoked with the available services and parameters:
Cannot resolve parameter 'Microsoft.Extensions.Caching.Memory.IMemoryCache cache' of constructor 'Void .ctor(Microsoft.Extensions.Caching.Memory.IMemoryCache)'.
我的服务配置是这样的:
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 的含义是!
任何人都可以帮我弄清楚我做错了什么 missing/am 以及为什么这种情况在新版本的 .NET Core 中开始发生但只在 .NET Core 2.1 中起作用?
您正在向此处的管道添加 IRateLimitCounterStore
:
.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>()
你可以从 the source 中看到 MemoryCacheRateLimitCounterStore
class 在其构造函数中采用 IMemoryCache
:
public MemoryCacheRateLimitCounterStore(IMemoryCache cache) : base(cache)
{
}
如果您不向您的管道提供 IMemoryCache
,则此 class 无法通过 DI 构建(这就是错误告诉您的内容)。
查看源文件的历史,它似乎总是需要将参数传递给它的构造函数。也许,在 2.1 版中,其他一些服务在幕后添加了一个 IMemoryCache
,但在 3.0 中不再为您添加一个。
添加内存缓存并没有真正的问题 - 只要您一直在使用 MemoryCacheRateLimitCounterStore
,它就会以某种方式添加。看来你只需要在这一点上自己添加它。
自从切换到 .NET Core 3.0 和 3.1 后,我在 application/API 启动时遇到以下 AspNetCoreRateLimit 错误:
'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'AspNetCoreRateLimit.MemoryCacheRateLimitCounterStore' can be invoked with the available services and parameters: Cannot resolve parameter 'Microsoft.Extensions.Caching.Memory.IMemoryCache cache' of constructor 'Void .ctor(Microsoft.Extensions.Caching.Memory.IMemoryCache)'.
我的服务配置是这样的:
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 的含义是!
任何人都可以帮我弄清楚我做错了什么 missing/am 以及为什么这种情况在新版本的 .NET Core 中开始发生但只在 .NET Core 2.1 中起作用?
您正在向此处的管道添加 IRateLimitCounterStore
:
.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>()
你可以从 the source 中看到 MemoryCacheRateLimitCounterStore
class 在其构造函数中采用 IMemoryCache
:
public MemoryCacheRateLimitCounterStore(IMemoryCache cache) : base(cache)
{
}
如果您不向您的管道提供 IMemoryCache
,则此 class 无法通过 DI 构建(这就是错误告诉您的内容)。
查看源文件的历史,它似乎总是需要将参数传递给它的构造函数。也许,在 2.1 版中,其他一些服务在幕后添加了一个 IMemoryCache
,但在 3.0 中不再为您添加一个。
添加内存缓存并没有真正的问题 - 只要您一直在使用 MemoryCacheRateLimitCounterStore
,它就会以某种方式添加。看来你只需要在这一点上自己添加它。