web api 限制单个IP在一定时间内访问次数

发布时间:2017-6-23 20:14:13 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"web api 限制单个IP在一定时间内访问次数 ",主要涉及到web api 限制单个IP在一定时间内访问次数 方面的内容,对于web api 限制单个IP在一定时间内访问次数 感兴趣的同学可以参考一下。

namespace Lemon.Stats.Apis{    /// <summary>    /// 限制单个IP短时间内访问次数    /// </summary>    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]    public class IPActionFilterAttribute : ActionFilterAttribute    {        /// <summary>        /// 限制单个IP短时间内访问次数        /// </summary>        /// <param name="actionContext"></param>        public override void OnActionExecuting(HttpActionContext actionContext)        {            string ip = HttpHelper.GetClientIp(actionContext.Request);            //var isValid = IPCacheHelper.CheckIsAble(ip);            IPCacheInfoModel ipModel =  IPCacheHelper.GetIPLimitInfo(ip);            if (!ipModel.IsVisit)            {                Logger.Warn(string.Format("IP【{0}】被限制了【{1}】次数",ipModel.IP,ipModel.Limit));                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, "系统正忙,请稍微再试。");                return;            }            base.OnActionExecuting(actionContext);        }    }}

2、IPCacheHelper:

using Lemon.Stats.Model;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Lemon.Stats.Apis{    /// <summary>    /// 限制单个IP访问次数    /// </summary>    public class IPCacheHelper    {         /// <summary>                 /// IP缓存集合                  /// </summary>               private static List<IPCacheInfoModel> dataList = new List<IPCacheInfoModel>();        private static object lockObj = new object();        /// <summary>                /// 一段时间内,最大请求次数,必须大于等于1        ///</summary>         private static int maxTimes = 3;        /// <summary>          /// 一段时间长度(单位秒),必须大于等于1             /// </summary>        private static int partSecond = 30;        /// <summary>          /// 请求被拒绝是否加入请求次数            /// </summary>          private static bool isFailAddIn = false;        static IPCacheHelper()        {                 }        /// <summary>              /// 设置时间,默认maxTimes=3, partSecond=30                 /// </summary>                /// <param name="_maxTimes">最大请求次数</param>                /// <param name="_partSecond">请求单位时间</param>                 public static void SetTime(int _maxTimes, int _partSecond)        {            maxTimes = _maxTimes;            partSecond = _partSecond;        }        /// <summary>            /// 检测一段时间内,IP的请求次数是否可以继续请求和使用          /// </summary>                /// <param name="ip">ip</param>           /// <returns></returns>               public static bool CheckIsAble(string ip)        {            lock (lockObj)            {                var item = dataList.Find(p => p.IP == ip);                if (item == null)                {                    item = new IPCacheInfoModel();                    item.IP = ip;                    item.ReqTime.Add(DateTime.Now);                    dataList.Add(item);                    return true;                }                else                {                    if (item.ReqTime.Count > maxTimes)                    {                        item.ReqTime.RemoveAt(0);                    }                    var nowTime = DateTime.Now;                    if (isFailAddIn)                    {                        #region 请求被拒绝也需要加入当次请求                        item.ReqTime.Add(nowTime);                        if (item.ReqTime.Count >= maxTimes)                        {                            if (item.ReqTime[0].AddSeconds(partSecond) > nowTime)                            {                                return false;                            }                            else                            {                                return true;                            }                        }                        else                        {                            return true;                        }                        #endregion                    }                    else                    {                        #region 请求被拒绝就不需要加入当次请求了                        if (item.ReqTime.Count >= maxTimes)                        {                            if (item.ReqTime[0].AddSeconds(partSecond) > nowTime)                            {                                return false;                            }                            else                            {                                item.ReqTime.Add(nowTime);                                return true;                            }                        }                        else                        {                            item.ReqTime.Add(nowTime);                            return true;                        }

上一篇:工作与生活如何平衡?
下一篇:ubuntu命令大全

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。