Ограничение скорости с ASP.NET и global.asax - PullRequest
5 голосов
/ 28 июня 2010

Что является хорошим простым способом разрешить только один запрос на IP в секунду, используя файл global.asax ASP.NET? Есть ли что-то еще встроенное в ASP.NET, о котором я не думаю?

Если возможно, я бы хотел игнорировать только запросы, которые являются множественными POST от функций jQuery Ajax. Я пытаюсь исправить распространенную проблему в существующем устаревшем приложении.

1 Ответ

1 голос
/ 28 июня 2010

Это простой способ сделать это с помощью 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);
    }

С уважением, Джонас Стенсвед

...