加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

使用ASP.NET和global.asax进行速率限制

发布时间:2020-12-16 07:43:46 所属栏目:asp.Net 来源:网络整理
导读:使用ASP.NET的global.asax文件,每个IP每秒只允许一个请求的简单方法是什么? ASP.NET中没有其他内置的东西我没想到的吗? 如果可能的话,我只想忽略来自jQuery的Ajax函数的多个POST的请求.我正在尝试修复现有遗留应用中的普遍问题. 解决方法 这是使用Applicat
使用ASP.NET的global.asax文件,每个IP每秒只允许一个请求的简单方法是什么? ASP.NET中没有其他内置的东西我没想到的吗?

如果可能的话,我只想忽略来自jQuery的Ajax函数的多个POST的请求.我正在尝试修复现有遗留应用中的普遍问题.

解决方法

这是使用Application State执行此操作的简单方法,因为它适用于访问应用程序的所有用户和会话.

在一个名为RequestManager.cs的新文件中

public static class RequestManager
{
    public static void Validate(HttpContext context)
    {


        if (context.Application["Blocklist"] == null)
            context.Application.Add("Blocklist",new Dictionary<string,DateTime>());

        Dictionary<string,DateTime> blocklist = context.Application["Blocklist"] as Dictionary<string,DateTime>;

        if (blocklist.ContainsKey(context.Request.UserHostAddress))
        {
            DateTime lastRequest = blocklist[context.Request.UserHostAddress];
            if (DateTime.Now.Subtract(lastRequest).TotalMilliseconds < 1000)
            {
                // End request
                context.Response.Write(string.Format("You'll have to wait for {0} milliseconds until next request",1000 - DateTime.Now.Subtract(lastRequest).TotalMilliseconds));
                context.Response.End();
            }
            else
            {
                blocklist[context.Request.UserHostAddress] = DateTime.Now;
            }
        }
        else
        {
            blocklist.Add(context.Request.UserHostAddress,DateTime.Now);
        }

    }
}

在你的Global.asax中:

protected void Application_BeginRequest(object sender,EventArgs e)
    {
        RequestManager.Validate(HttpContext.Current);
    }

问候,Jonas Stensved

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读