第一步:我们可以安装一个工具包“Cx.NetCoreUtils”简化代码操作
第二步:我们先吧中间件的代码写出来,我们用到.net core的本地内存缓存 IMemoryCache 来实现记录客户的ip,
public class CurrentLimiting: ActionFilterAttribute
{
/// <summary>
/// 每多少秒限流的请求上线
/// </summary>
public static int Count=60;
/// <summary>
/// 多少秒限流
/// </summary>
public static int Seconds=60;
private readonly IMemoryCache memory;
public CurrentLimiting(
IMemoryCache memory
)
{
this.memory = memory;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var targetInfo = $"{filterContext.HttpContext.Connection.RemoteIpAddress.MapToIPv4()}";//获取客户的ip地址然后进行缓存
if (!memory.TryGetValue(targetInfo, out Data data)) {
data = new Data
{
Count = 1,
Time = DateTime.Now.AddSeconds(Seconds)//记录本次添加时间然后叠加配置的秒数
};
memory.Set(targetInfo, data, data.Time);
}
else {
if (data.Count> Count) {
filterContext.Result = new ObjectResult(new ModelStateResult($"ip:{filterContext.HttpContext.Connection.RemoteIpAddress.MapToIPv4()},请求速度过快,超过每{Seconds}秒{Count}次限制,请稍后请求", 413));//这边是超过设置的请求数量进行返回
}
else {
data.Count++;
memory.Set(targetInfo, data, data.Time);//没有超过就继续添加过期时间继续使用第一次添加的
}
}
base.OnActionExecuting(filterContext);
}
public class Data
{
public DateTime Time { get; set; }
public int Count { get; set; }
}
}
第三步:中间件代码创建好然后在 Startup.cs配置文件配置
services.AddMemoryCache();services.AddControllers(o =>
{
o.Filters.Add(typeof(GlobalExceptionsFilter));
o.Filters.Add(typeof(GlobalResponseFilter));
o.Filters.Add<GlobalModelStateValidationFilter>();
o.Filters.Add<CurrentLimiting>();
}).AddNewtonsoftJson(options =>
{
options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
options.SerializerSettings.DateFormatString = Constants.DefaultFullDateFormat;
});
启动服务器然后对接口进行快速访问
哈哈很简单吧,先就这样,技术交流请评论!谢谢观看!