2010-06-28 96 views
5

使用ASP.NET的global.asax文件,每秒只允許一個IP請求的簡單方法是什麼?有沒有其他內置到ASP.NET,我沒有想到?使用ASP.NET和global.asax限制速率

如果可能,我只想忽略來自jQuery的Ajax函數的多個POST請求。我正在嘗試修復現有遺留應用程序中普遍存在的問題。

+0

剛剛注意到這是不大不小的欺騙的。不確定是否有新的理由來覆蓋。 – BuddyJoe 2010-06-28 14:54:36

回答

1

這是一種使用應用程序狀態的簡單方法,因爲它適用於訪問應用程序的所有用戶和會話。

在一個新的文件名爲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); 
    } 

問候, 喬納斯Stensved