1、在接口项目nutget中找到AspNetCoreRateLimit组件
2、在appsettings.json中配置以下内容
"IpRateLimiting": {
//当为True的时候 例如设置了5次每分钟访问限流,当你getData()5次过后禁止访问,但是还可以访问postData()5次,
//总得来说是每个接口都有5次在这一分钟,互不干扰。"当为False的时候" "每个接口都加入计数,不管你访问哪个接口","只要在一分钟内累计够5次" "将禁止访问",
"EnableEndpointRateLimiting": true,
"StackBlockedRequests": false,
"RealIpHeader": "X-Real-IP",
"ClientIdHeader": "X-ClientId",
"IpWhitelist": null,
"EndpointWhitelist": null,
"HttpStatusCode": 429,
"QuotaExceededResponse": {
"Content": "{{ \"message\": \"Too many requests,Please try again in {2} second(s).\", \"code\": 429,\"data \":\"\"}}",
"ContentType": "application/json"
},
"GeneralRules": [
{
"Endpoint": "*",
"Period": "4s",
"Limit": 1
}
]
}
3、在Startup.cs中ConfigureServices方法中添加配置
#region 限流配置
//加载配置
services.AddOptions();
//services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);//设置兼容性版本
services.AddMemoryCache();
//加载IpRateLimiting配置
services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
//注入计数器和规则存储
services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
//添加框架服务
services.AddMvc();
// clientId / clientIp解析器使用它。
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
//配置(计数器密钥生成器)
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
#endregion
4、在Startup.cs中Configure方法中注册使用中间件
app.UseIpRateLimiting();
注意,可以自定义中间件来指定返回的信息,即在appsettings.json中IpRateLimiting节点下面的QuotaExceededResponse信息,方法如下:
在项目中自定义添加一个IPLimitMiddleware类,然后继承IpRateLimitMiddleware类,重写ReturnQuotaExceededResponse方法,代码如下:
public class IPLimitMiddleware : IpRateLimitMiddleware
{
private readonly IpRateLimitOptions _options;
private readonly IIpPolicyStore _ipPolicyStore;
public IPLimitMiddleware(RequestDelegate next, IOptions<IpRateLimitOptions> options, IRateLimitCounterStore counterStore, IIpPolicyStore policyStore,
IRateLimitConfiguration config, ILogger<IpRateLimitMiddleware> logger)
: base(next, options, counterStore, policyStore, config, logger)
{
_options = options.Value;
_ipPolicyStore = policyStore;
}
public override Task ReturnQuotaExceededResponse(HttpContext httpContext, RateLimitRule rule, string retryAfter)
{
var ip = httpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault();
if (string.IsNullOrEmpty(ip))
{
ip = httpContext.Connection.RemoteIpAddress.ToString();
}
httpContext.Response.ContentType = "application/json";
return httpContext.Response.WriteAsync($"{{ \"Code\": 429,\"msg\": \"操作频率过快,要求是: 每{rule.Period}秒{rule.Limit}次,请在{retryAfter}秒后再试!\" }}");
}
}
小问题1:在appsettings.json中定义的中文信息,取出来之后如果出现了乱码,则可以通过notpad++ 将文件格式改为utf-8