Pertanyaan Pembatasan Tingkat dengan ASP.NET dan global.asax


Apa cara sederhana yang baik untuk hanya mengizinkan satu permintaan per IP per detik menggunakan file global.asax ASP.NET? Apakah ada sesuatu yang lain yang built-in ke ASP.NET yang tidak saya pikirkan?

Jika memungkinkan, saya hanya ingin mengabaikan permintaan yang merupakan beberapa POST dari fungsi Ajax jQuery. Saya mencoba memperbaiki masalah yang merembes di aplikasi warisan yang ada.


5
2018-06-28 14:43


asal


Jawaban:


Ini adalah cara sederhana untuk melakukannya dengan menggunakan Negara Aplikasi karena ini berlaku untuk semua pengguna dan sesi yang mengakses aplikasi Anda.

Dalam file baru bernama 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);
        }

    }
}

Di Global.asax Anda:

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

Salam, Jonas Stensved


1
2018-06-28 15:12