学习C#调用AspNetCoreRateLimit包限制客户端访问次数(3:动态配置)

C#调用AspNetCoreRateLimit限流,如果在appsettings.json中设置IpRateLimiting和IpRateLimitPolicies,则在项目启动时从appsettings.json中加载并应用规则,但在运行过程中没有办法调整规则,此时可以使用IpRateLimitOptions和IIpPolicyStore接口获取并调整限流规则,也可以基于这两个接口将限流规则保存到数据库或第三方缓存,或者从数据库或第三方缓存中读取并应用缓存
  IpRateLimitOptions接口维护全局行为与通用规则,对应appsettings.json的IpRateLimiting配置,IIpPolicyStore接口维护特定IP或IP段的限流规则,对应appsettings.json的IpRateLimitPolicies配置。IpRateLimitOptions接口继承自RateLimitOptions类,其内的属性与appsettings.json的IpRateLimiting配置属性大致相同,可以参照之前的文章设置参数,而IIpPolicyStore接口继承自IRateLimitStore,需要调用GetAsync获取IpRateLimitPolicies策略对象,调整策略数据后再调用SetAsync保存IpRateLimitPolicies策略对象。
  根据参考文献1的示例代码,结合参考文献2及DeepSeek,编写了动态配置的示例代码,经过验证调用AddGeneralRule动态调整通用规则运行正常,但是添加AddIpRule函数添加的特定规则没有生效,经过调试新增的规则已经保存到_ipPolicyStore内,且代码逻辑和参考文献及大模型给出的代码相同,暂时不清楚不生效的原因

csharp 复制代码
public class RateLimitController : ControllerBase
{ 
    private readonly IpRateLimitOptions _options;
    private readonly IIpPolicyStore _ipPolicyStore;

    public RateLimitController(IOptions<IpRateLimitOptions> optionsAccessor, IIpPolicyStore ipPolicyStore)
    {
        _options = optionsAccessor.Value;
        _ipPolicyStore = ipPolicyStore;
    }

    [HttpGet]
    public string GetString(string content)
    {
        return content;
    }
    
    [HttpGet]
    public void AddGeneralRule()
    {
        _options.GeneralRules.Add(new RateLimitRule
        {
            Endpoint = "*",
            Limit = 2,
            Period = "30s"
        });

        if(_options.EndpointWhitelist==null)
        {
            _options.EndpointWhitelist=new List<string>();
        }

        _options.EndpointWhitelist.Add("get:/RateLimit/AddIpRule");
    }

    [HttpGet]
    public async Task AddIpRule()
    {
        var policy = await _ipPolicyStore.GetAsync(_options.IpPolicyPrefix, HttpContext.RequestAborted);

        if (policy == null)
        {
            await _ipPolicyStore.SeedAsync();

            policy = _ipPolicyStore.GetAsync(_options.IpPolicyPrefix).Result;
        }

        policy.IpRules.AddRange(new IpRateLimitPolicy
        {
            Ip = "::1",
            Rules = new List<RateLimitRule>(new RateLimitRule[] {
                new RateLimitRule {
                    Endpoint = "*:/RateLimit/GetString",
                    Limit = 5,
                    Period = "30s" },
					})
        },
           new IpRateLimitPolicy
           {
               Ip = "127.0.0.1",
               Rules = new List<RateLimitRule>(new RateLimitRule[] {
                   new RateLimitRule {
                       Endpoint = "*:/RateLimit/GetString",
                       Limit = 5,
                       Period = "30s" },
				})
        });

        await _ipPolicyStore.SetAsync(_options.IpPolicyPrefix, policy, cancellationToken: HttpContext.RequestAborted).ConfigureAwait(false);

    }        
}

参考文献:

1\]https://github.com/stefanprodan/AspNetCoreRateLimit \[2\]https://github.com/stefanprodan/AspNetCoreRateLimit/wiki/IpRateLimitMiddleware

相关推荐
加号34 小时前
【C#】 字符串字节到十六进制字节数组的转换解析
c#
JaydenAI5 小时前
[MAF的Agent管道详解-04]如何让LLM按照要求的结构输出数据?
ai·c#·agent·maf·agent pipeline
不会编程的懒洋洋7 小时前
VisionPro 中 几何相交工具 Geometry-Intersection
图像处理·笔记·c#·视觉检测·机器视觉·visionpro
不会编程的懒洋洋10 小时前
VisionPro 中 图像预处理工具
图像处理·笔记·c#·视觉检测·visionpro
雪豹阿伟12 小时前
9.C# —— string拓展方法、StringBuilder高性能处理
c#·上位机
李星星_Alex12 小时前
如何通过 C# 抓取抖音 RTMP 推流码实现自主推流
c#·抖音
qq74223498416 小时前
全面深入的C#核心知识体系与编程实践精要——从语法基础到高级特性系统学习指南
java·算法·c#
fai厅的秃头姐!17 小时前
2586. 统计范围内的元音字符串数
开发语言·c#
正运动技术17 小时前
C#运动控制开源(二): CAD导图和小线段速度前瞻优化
c#·正运动技术·运动控制器·运动控制卡·正运动控制器·运动控制开源·ethercat运动控制器
楼田莉子18 小时前
C#学习:分支与循环
服务器·后端·学习·c#