欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-10 14:31:31
 站点ip访问频率限制 针对单个站点 using system; using system.collections.generic; using s...

 站点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访问频率限制 针对单个站点的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。