C# 站点IP访问频率限制 针对单个站点的实现方法
站点IP访问频率限制针对单个站点
usingSystem;
usingSystem.Collections.Generic;
usingSystem.IO;
//usingSystem.Linq;
usingSystem.Web;
//<summary>
//IP访问频率控制
//</summary>
publicstaticclassIPCacheManager
{
///<summary>
///IP缓存集合
///</summary>
privatestaticList<IPCacheInfo>dataList=newList<IPCacheInfo>();
privatestaticobjectlockObj=newobject();
///<summary>
///一段时间内,最大请求次数,必须大于等于1
///</summary>
privatestaticintmaxTimes=3;
///<summary>
///一段时间长度(单位秒),必须大于等于1
///</summary>
privatestaticintpartSecond=30;
///<summary>
///请求被拒绝是否加入请求次数
///</summary>
privatestaticboolisFailAddIn=false;
staticIPCacheManager()
{
}
///<summary>
///设置时间,默认maxTimes=3,partSecond=30
///</summary>
///<paramname="_maxTimes">最大请求次数</param>
///<paramname="_partSecond">请求单位时间</param>
publicstaticvoidSetTime(int_maxTimes,int_partSecond)
{
maxTimes=_maxTimes;
partSecond=_partSecond;
}
///<summary>
///检测一段时间内,IP的请求次数是否可以继续请求
///和使用
///</summary>
///<paramname="ip"></param>
///<returns></returns>
publicstaticboolCheckIsAble(stringip)
{
lock(lockObj)
{
varitem=dataList.Find(p=>p.IP==ip);
if(item==null)
{
item=newIPCacheInfo();
item.IP=ip;
item.ReqTime.Add(DateTime.Now);
dataList.Add(item);
returntrue;
}
else
{
if(item.ReqTime.Count>maxTimes)
{
item.ReqTime.RemoveAt(0);
}
varnowTime=DateTime.Now;
if(isFailAddIn)
{
#region请求被拒绝也需要加入当次请求
item.ReqTime.Add(nowTime);
if(item.ReqTime.Count>=maxTimes)
{
if(item.ReqTime[0].AddSeconds(partSecond)>nowTime)
{
returnfalse;
}
else
{
returntrue;
}
}
else
{
returntrue;
}
#endregion
}
else
{
#region请求被拒绝就不需要加入当次请求了
if(item.ReqTime.Count>=maxTimes)
{
if(item.ReqTime[0].AddSeconds(partSecond)>nowTime)
{
returnfalse;
}
else
{
item.ReqTime.Add(nowTime);
returntrue;
}
}
else
{
item.ReqTime.Add(nowTime);
returntrue;
}
#endregion
}
}
}
}
}
publicclassIPCacheInfo
{
publicstringIP{get;set;}
privateList<DateTime>reqTime=newList<DateTime>();
publicList<DateTime>ReqTime
{
get{returnthis.reqTime;}
set{this.reqTime=value;}
}
}
以上这篇C#站点IP访问频率限制针对单个站点的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。