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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索限制ip访问频率
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-09-21 07:35:21

C# 站点IP访问频率限制 针对单个站点的实现方法_C#教程的相关文章

win10系统提示没有有效的IP配置的原因分析及两种解决方法图文教程

原因分析: 其实,该问题一般是由于网络出错导致的. 解决方法一: 将路由器和猫重启一下,一般都可以解决了! 解决方法二: 1.在开始菜单上单击鼠标右键,选择"命令提示符(管理员)": 2.在命令提示符框中输入:netsh winsock reset按下回车键,在弹出的已重置的提示后重启计算机即可解决问题! 以上就是win10系统提示没有有效的IP配置的原因分析及两种解决方法图文教程,方法很简单,同样遇到win10无线无法连接显示没有有效的IP配置问题的用户们,快去尝试操作看看吧!

C# Winform 子窗体访问父级窗体的控件和属性_C#教程

今天在做一个联系人管理的C#设计时,遇到了这个问题,我需要将父窗体中的textBox中的值传到子窗体并进行数据库查询操作,我用了new 父窗体().textBox.text;来进行值传递,然而并无卵用,经过多次试验,找到了一个比较简单的解决方法: 一.子窗体调用父窗体的静态变量 父窗体:Logout 子窗体:Affirm 父窗体文本框:tB_Logout_Username public partial class Logout : Form { //定义一个静态变量存放父窗体中的文本框的值 pu

asp.net(C#)清除全部Session与单个Session的方法_C#教程

实例如下: Session.Abandon();//清除全部Session //清除某个Session Session["UserName"] = null; Session.Remove("UserName"); 以上这篇asp.net(C#)清除全部Session与单个Session的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持. 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续使用

用C#编写获取远程IP,MAC的方法_C#教程

如果要想获得远程的地址,需要用sendarp这个函数来实现.具体的代码如下:  [DllImport("Iphlpapi.dll")]  private static unsafe extern int SendARP(Int32 dest,Int32 host,ref IntPtr mac,ref IntPtr length);  [DllImport("Ws2_32.dll")]  private static extern Int32 inet_addr(st

C# ping网络IP 实现网络状态检测的方法_C#教程

C# ping网络IP 实现网络状态检测的方法 public string GetHostNameByIp(string ip)  {  ip = ip.Trim();  if (ip == string.Empty)  return string.Empty;  try  {  // 是否 Ping 的通  if (this.Ping(ip))  {  System.Net.IPHostEntry host = System.Net.Dns.GetHostEntry(ip);  return 

WinForm子窗体访问父窗体控件的实现方法_C#教程

Form1主窗体: 复制代码 代码如下: public delegate void SetVisiableHandler();//定义委托类型 private void button1_Click(object sender,EventArgs e)//单击事件,打开子窗体{    Form2 frm = new Form2(new SetVisiableHandler(SetVisiable));    frm.Show();} private void SetVisiable(){    d

C# datatable 不能通过已删除的行访问该行的信息处理方法_C#教程

原因如下: Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除, 还可以通过datatable.RejectChanges()回滚,使该行取消删除. 如果要彻底删除datarow,需要Delete()和AccepteChanges()方法同时使用,或者采用datatable.Rows.RemoveAt(i)方法直接删除, 其中i表示行索引,还有一个就是datatable.Rows.Remove(DataR

在nginx中实现单位时间内限制访问频率的教程_nginx

首先说一下遇到这个问题是因为网站被攻击,阿里云报警,想到要限制一下访问频率,而不是限制ip(限制ip的方案稍后给出).nginx连接资源被吃空返回状态码是502,添加本方案限制后返回599,与正常状态码区别开. 步骤如下: 首先nginx.conf里面添加如下内容: map $http_x_forwarded_for $clientRealIp { "" $remote_addr; ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr; } #

Nginx服务器限制IP访问的各种情况全解析_nginx

限制某个IP同一时间段的访问次数 如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候.其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包, 造成对方服务器资源耗尽,一直到宕机崩溃.    cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过HttpLimitReqModul和HttpLimi