2010-06-28 29 views
5

ASP.NET'in global.asax dosyasını kullanarak saniyede IP başına yalnızca bir isteğe izin vermenin iyi bir yolu nedir? ASP.NET'e yerleşik olmayan başka bir şey var mı?ASP.NET ve global.asax ile Hız Sınırlama

Mümkünse, jQuery'nin Ajax işlevlerinden birden çok POST olan istekleri göz ardı etmek istiyorum. Mevcut bir eski uygulamada yaygın bir sorunu çözmeye çalışıyorum.

+0

Jonas Stensved sadece bu tür dupe olduğunu fark ettim. Burada yeni bir yer olup olmadığından emin değil. – BuddyJoe

cevap

1

Bu, uygulamanıza erişen tüm kullanıcılara ve oturumlara uygulandığından, Uygulama Durumu'nu kullanarak bunu yapmanın basit bir yoludur.

yeni bir dosya olarak

denilen RequestManager.cs sizin Global.asax içinde

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); 
     } 

    } 
} 

:

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

Selamlar,