2010-06-28 11 views
5

Quelle est une bonne manière simple de n'autoriser qu'une requête par IP par seconde en utilisant le fichier global.asax d'ASP.NET? Est-ce qu'il y a quelque chose d'autre qui est intégré à ASP.NET auquel je ne pense pas?Limitation de débit avec ASP.NET et global.asax

Si possible, je voudrais ignorer uniquement les requêtes qui sont plusieurs POST à ​​partir des fonctions Ajax de jQuery. J'essaie de résoudre un problème envahissant dans une application existante existante.

+0

juste remarqué ce fut une sorte de dupe. Je ne sais pas s'il y a un nouveau terrain ici pour couvrir. – BuddyJoe

Répondre

1

Ceci est une manière simple de le faire en utilisant l'état de l'application puisqu'il s'applique à tous les utilisateurs et sessions accédant à votre application.

Dans un nouveau fichier appelé 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); 
     } 

    } 
} 

Dans votre Global.asax:

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

Cordialement, Jonas Stensved