当前位置: 移动技术网 > IT编程>开发语言>c# > C# 站点IP访问频率限制 针对单个站点的实现方法

C# 站点IP访问频率限制 针对单个站点的实现方法

2019年07月18日  | 移动技术网IT编程  | 我要评论

 站点ip访问频率限制 针对单个站点

using system;
using system.collections.generic;
using system.io;
//using system.linq;
using system.web;

// <summary>
// ip访问频率控制
// </summary> 
public static class ipcachemanager
{

  /// <summary>
  /// ip缓存集合 
  /// </summary> 
  private static list<ipcacheinfo> datalist = new list<ipcacheinfo>();
  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 ipcachemanager()
  {
  }

  /// <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"></param> 
  /// <returns></returns> 
  public static bool checkisable(string ip)
  {
    lock (lockobj)
    {
      var item = datalist.find(p => p.ip == ip);
      if (item == null)
      {
        item = new ipcacheinfo();
        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;
          }
          #endregion
        }
      }
    }
  }
}

public class ipcacheinfo
{
  public string ip { get; set; }

  private list<datetime> reqtime = new list<datetime>();
  public list<datetime> reqtime
  {
    get { return this.reqtime; }
    set { this.reqtime = value; }
  }
}

以上这篇c# 站点ip访问频率限制 针对单个站点的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网