Loading... ### 前言 IpRateLimitMiddleware([Github: AspNetCoreRateLimit](https://github.com/stefanprodan/AspNetCoreRateLimit)) 是ASPNETCore的一个限流的中间件,用于控制客户端调用API的频次, 如果客户端频繁访问服务器,可以限制它的频率,已降低访问服务器端的压力。或者如果有爬虫在爬取关键数据,也可以限制某个/某些API或者某些IP的每天调取次数, 这样限制他爬取的速度。 当然, 其实我要解决的是另外一个问题。 我们写的WebApi有时候会存在一些API,我们只希望其它内部应用来调用,比如,WebApi的HealthCheck, 我们就希望只有我们的中台可以定时调用来获取信息, 而前端是不能调用。这个我们就可以把内部的IP地址放到IpWhitelist配置项中, 并且限制特定的API调用次数为0次, 这样只有白名单里面的地址可以访问对应的端点, 如下所示。 ### 使用 #### NuGet安装:`Install-Package AspNetCoreRateLimit` #### Startup 配置 ```csharp public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { //添加IP限流 //services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest); //services.AddOptions(); //services.AddMemoryCache(); //services.Configure<IpRateLimitOptions>(App.Configuration.GetSection("IpRateLimit")); //services.AddSingleton<IProcessingStrategy, AsyncKeyLockProcessingStrategy>(); //services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>(); //services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>(); //services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>(); //services.AddHttpContextAccessor(); } ``` #### Configure 调用中间件`UseIpRateLimiting` ```csharp public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { //启用限流 //app.UseIpRateLimiting(); } ``` #### `appsettings.json` 配置 ```csharp "IpRateLimit": { "EnableEndpointRateLimiting": true, "StackBlockedRequests": false, "RealIPHeader": "X-Real-IP", "ClientIdHeader": "X-ClientId", "HttpStatusCode": 429, "GeneralRules": [ { "Endpoint": "*:/file/multipart/upload", "Period": "1s", "Limit": 20 }, { "Endpoint": "*", "Period": "1s", "Limit": 2 }, { "Endpoint": "*", "Period": "15m", "Limit": 300 }, { "Endpoint": "*", "Period": "12h", "Limit": 3000 }, { "Endpoint": "*", "Period": "7d", "Limit": 50000 } ] } ``` ### 配置说明 如果EnableEndpointRateLimiting设置为false则全局将应用限制,并且仅应用具有作为端点的规则*。例如,如果您设置每秒5次调用的限制,则对任何端点的任何HTTP调用都将计入该限制。 如果EnableEndpointRateLimiting设置为true,则限制将应用于每个端点,如{HTTP_Verb}{PATH}。例如,如果您为*:/api/values客户端设置每秒5个呼叫的限制,则可以GET /api/values每秒呼叫5次,但也可以呼叫5次PUT /api/values。 如果StackBlockedRequests设置为false,拒绝的API调用不会添加到调用次数计数器上。比如: 如果客户端每秒发出3个请求并且您设置了每秒一个调用的限制,则每分钟或每天计数器等其他限制将仅记录第一个调用,即成功的API调用。如果您希望被拒绝的API调用计入其他时间的显示(分钟,小时等),则必须设置StackBlockedRequests为true。 在RealIpHeader使用时,你的Kestrel 服务器背后是一个反向代理,如果你的代理服务器使用不同的页眉然后提取客户端IP X-Real-IP使用此选项来设置它。 将ClientIdHeader被用于提取白名单的客户端ID。如果此标头中存在客户端ID并且与ClientWhitelist中指定的值匹配,则不应用速率限制。 ### 测试 ![](https://img-blog.csdnimg.cn/3f654794d0f443d0b142ae99353e26ec.png) 最后修改:2023 年 10 月 08 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏