【问题标题】:How to implement Rate limit in Asp.net Framework API如何在 Asp.net Framework API 中实现速率限制
【发布时间】:2022-08-22 19:43:55
【问题描述】:

我试图限制 api 调用的速率以避免 DDos 攻击。我想要实现的是将一分钟内可以拨打的电话数量限制为 60 次,或每秒拨打 1 次电话。

我找到了 .net core api 的实现,但是对于 .net framework api,我找不到任何东西。请帮忙。

使用 ASP.net 核心 api,它看起来像这样(从 elmah blog 获得)。

在 program.cs 或 startup.cs

services.AddMemoryCache();
services.AddSingleton<IClientPolicyStore, MemoryCacheClientPolicyStore>();
services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();

然后添加

services.Configure<ClientRateLimitOptions>(options =>
{
 options.GeneralRules = new List<RateLimitRule>
 {
    new RateLimitRule
    {
        Endpoint = \"*\",
        Period = \"1m\",
        Limit = 500,
    },
    new RateLimitRule
    {
        Endpoint = \"*\",
        Period = \"1h\",
        Limit = 3600,
    }
  };
});

有人知道如何为 ASP.net 框架 API 做一个吗?

  • 你好。作者在这里。我遇到了 WebApiThrottle 并且不明白那里发生了什么。
  • 它现在可能没用,但如果你的应用计划在 12 月或更晚发布,你可能想看看这个视频。 youtube.com/watch?v=gMTvNnKt3AA 它解释了 .NET 7 中的新速率限制功能,这正是您正在寻找的。但是 .NET 7 还没有发布,计划在今年 11 月发布。
  • 要是。这个项目有点麻烦。我正在更新一个旧项目。它使用旧的依赖项。我不允许升级项目。谢谢@Joost00719

标签: c# asp.net asp.net-core asp.net-web-api


【解决方案1】:

如果你在这里,请注意。截至我编写此代码时,我还没有看到我可以使用的解决方案,所以我创建了我的。

我创建了一个在控制器中调用的任务/服务。这个任务是这样的:

 public bool IsWithinRangeLimit()
    {
        var dbEntities = new DbEntities();
        var isWithinRangeLimit = true;
        int rangeLimitNumber = int.Parse( ConfigurationManager.AppSettings["RateLimitNumber"].ToString() );
        int timeSpanInMins = int.Parse(ConfigurationManager.AppSettings["RateLimitTimeInMins"].ToString() );



        try
        {

            var requestList = dbEntities.RequestTrackers.ToList();
            Random rd = new Random();
            int rand_num = rd.Next(100000, 30000000);
            var newTracker = new RequestTracker()
            {
                id = rand_num,
                requestDate = DateTime.Now
            };


          
            if (!requestList.Any())
            {
                dbEntities.RequestTrackers.Add(newTracker);
                dbEntities.SaveChanges();
            }
            else
            {
                var reqListOrganised = requestList.OrderByDescending(m => m.requestDate).Take(rangeLimitNumber);
                var endTime = DateTime.Now;
                var starttime = endTime.AddMinutes(-timeSpanInMins);
                var tenthDate = reqListOrganised.LastOrDefault().requestDate;


                if (starttime <= tenthDate && tenthDate <= endTime)
                {
                    isWithinRangeLimit = false;


                    
                }
                else
                {
                    dbEntities.RequestTrackers.Add(newTracker);
                    dbEntities.SaveChanges();
                }

                
            }
            
            
        }
        catch
        {
        }


        foreach (var item in dbEntities.RequestTrackers)
        {
            var isSAmeDay = this.IsSameDay(DateTime.Now, item.requestDate);
            if (!isSAmeDay)
            {
                dbEntities.RequestTrackers.Remove(item);

            }
            
        }
        dbEntities.SaveChanges();
        return isWithinRangeLimit;
        


    }

我添加的 isSameDay 类可以在 here 找到。

数据来自 web.config。它看起来像这样:

  <add key="RateLimitTimeInMins" value="1" />
  <add key="RateLimitNumber" value="2" />

“理想情况下”,您将希望创建一个自动增量表主键,并希望使用时间相关服务从数据库中处理不需要的日期。

如果您有更好的解决方案,请添加答案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2018-05-04
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多