public StackExchangeRedisClient(RedisCacheOption redisCacheOption, IRedisBinarySerializer serializer) { EnsureUtil.NotNull(redisCacheOption, "RedisCacheOptions"); EnsureUtil.NotNull(serializer, "IBinarySerializer"); _redisCacheOption = redisCacheOption; _serializer = serializer; _connectionMultiplexer = ConnectionMultiplexerFactory.GetConnection(_redisCacheOption.ConnectionString); }
/// <summary> /// Add and configure any of the middleware /// </summary> /// <param name="services">Collection of service descriptors</param> /// <param name="configuration">Configuration root of the application</param> public void ConfigureServices(IServiceCollection services, IConfiguration configuration, ITypeFinder typeFinder) { var isOpen = configuration.GetValue <bool>("EnableAspNetCoreRateLimit", false); if (isOpen) { //需要存储速率和ip规则 services.AddMemoryCache(); //加载appsettings.json中的配置项 ,下面三项是加载general,rules services.Configure <IpRateLimitOptions>(configuration.GetSection("IpRateLimiting")); services.Configure <IpRateLimitPolicies>(configuration.GetSection("IpRateLimitPolicies")); //load general configuration from appsettings.json services.Configure <ClientRateLimitOptions>(configuration.GetSection("ClientRateLimiting")); //load client rules from appsettings.json services.Configure <ClientRateLimitPolicies>(configuration.GetSection("ClientRateLimitPolicies")); services.AddStackExchangeRedisCache(options => { //options.ConfigurationOptions = new ConfigurationOptions //{ // //silently retry in the background if the Redis connection is temporarily down // AbortOnConnectFail = false //}; RedisCacheOption redisOptions = new RedisCacheOption(configuration); var configurationOptions = new ConfigurationOptions { ConnectTimeout = redisOptions.ConnectionTimeout, Password = redisOptions.Password, Ssl = redisOptions.IsSsl, SslHost = redisOptions.SslHost, }; foreach (var endpoint in redisOptions.Endpoints) { configurationOptions.EndPoints.Add(endpoint.Host, endpoint.Port); } options.ConfigurationOptions = configurationOptions; options.InstanceName = "NetPro.AspNetRateLimit"; }); // inject counter and rules stores //services.AddSingleton<IClientPolicyStore, MemoryCacheClientPolicyStore>(); services.AddSingleton <IClientPolicyStore, DistributedCacheClientPolicyStore>(); //注入计时器和规则 //services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>(); //services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>(); services.AddSingleton <IIpPolicyStore, DistributedCacheIpPolicyStore>(); services.AddSingleton <IRateLimitCounterStore, DistributedCacheRateLimitCounterStore>(); services.AddSingleton <IRateLimitConfiguration, RateLimitConfiguration>(); } }
/// <summary> /// /// </summary> /// <param name="next"></param> /// <param name="iLogger"></param> /// <param name="requestAnalysisOption"></param> /// <param name="memorycache"></param> /// <param name="redisManager"></param> /// <param name="redisCacheOption"></param> /// <param name="httpContextAccessor"></param> public RequestAnalysisMiddleware(RequestDelegate next, ILogger <RequestAnalysisMiddleware> iLogger, RequestAnalysisOption requestAnalysisOption, IMemoryCache memorycache, IRedisManager redisManager, RedisCacheOption redisCacheOption, IHttpContextAccessor httpContextAccessor) { _next = next; _iLogger = iLogger; _requestAnalysisOption = requestAnalysisOption; _memorycache = memorycache; _redisManager = redisManager; _redisCacheOption = redisCacheOption; _httpContextAccessor = httpContextAccessor; }
/// <summary> /// /// </summary> /// <param name="next"></param> /// <param name="iLogger"></param> /// <param name="requestAnalysisOption"></param> /// <param name="memorycache"></param> /// <param name="redisManager"></param> /// <param name="redisCacheOption"></param> /// <param name="httpContextAccessor"></param> public RequestAnalysisMiddleware(RequestDelegate next, ILogger <RequestAnalysisMiddleware> iLogger, RequestAnalysisOption requestAnalysisOption, IMemoryCache memorycache, #pragma warning disable CS0618 // Type or member is obsolete IRedisManager redisManager, #pragma warning restore CS0618 // Type or member is obsolete RedisCacheOption redisCacheOption, IHttpContextAccessor httpContextAccessor) { _next = next; _iLogger = iLogger; _requestAnalysisOption = requestAnalysisOption; _memorycache = memorycache; _redisManager = redisManager; _redisCacheOption = redisCacheOption; _httpContextAccessor = httpContextAccessor; }
static void Main(string[] args) { var host = new HostBuilder() .ConfigureHostConfiguration(configHost => { configHost.SetBasePath(Directory.GetCurrentDirectory()); configHost.AddEnvironmentVariables("ASPNETCORE_"); }) .ConfigureAppConfiguration((hostContext, configApp) => { configApp.AddJsonFile("appsettings.json", true); configApp.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", true); configApp.AddEnvironmentVariables(); }) .ConfigureServices((hostContext, services) => { var option = new RedisCacheOption(); var tt = hostContext.Configuration.GetSection("Redis").Get <RedisCacheOption>(); hostContext.Configuration.Bind("Redis", option); }) .Build(); host.Run(); }
/// <summary> /// 创建redis客户端 /// </summary> /// <param name="redisCacheOption">redis配置信息</param> /// <param name="serializer">序列化类</param> /// <returns></returns> public IRedisClient CreateClient(RedisCacheOption redisCacheOption, IRedisBinarySerializer serializer) { return(new StackExchangeRedisClient(redisCacheOption, serializer)); }
/// <summary> /// 创建redis客户端 /// </summary> /// <param name="redisCacheOption">redis配置信息</param> /// <returns></returns> public IRedisClient CreateClient(RedisCacheOption redisCacheOption) { return(new StackExchangeRedisClient(redisCacheOption, new RedisJsonBinarySerializer())); }