The lightweight .NET package provides a middleware service to protect your application by limiting the request rate. Suport old .NET Framework Project, support Redis, MemoryCache, System.Web.Caching.Cache.
$ dotnet add package RateLimit.FrameworkRateLimit.Framworklightweight package provides a middleware service to protect your application by limiting the request rate.old .NET Framework projectRedis, MemoryCache, System.Web.Caching.CacheIpAddress (can be config using with CookieName) contains the number of requests which cross over the MaxRequestPerPeriod, it will be blocked by returning a TooManyRequest(429) (config by BlockMessage) within the blocking time (config by BlockTimeSecond)Index.cshtml: make simple ajax call to HomeController$.ajax({
url: "/Home/GetItem/1234",
type: "GET",
async: false,
datatype: "json",
data: {
param1: "param1 data",
param2: "param2 data",
param3: "param3 data"
},
success: function (data) {
console.log(data)
},
error: function (err) {
console.log(err)
}
})
HomeController.cs: config RateLimitAttribute for GetReport actionusing Newtonsoft.Json;
using System.Web.Mvc;
using RateLimit; // use RateLimit package
namespace WebMVC.Controllers
{
public class HomeController : Controller
{
/* Config for every request come to this action */
[HttpGet]
[Route("GetItem/{id?}")]
[RateLimit(PeriodTime = 10
, MaxRequestPerPeriod = 1
, CookieName = "UserId"
, QueryParams = "param1, param2" // or "param2, param1" not need to do in order
, RouteParams = "id" // same here, you not need to do in order if you have many Route param
, BlockTime = 10
, BlockMessage = "You are making too many request")]
public ActionResult GetItem(string id, string param1, string param2)
{
return new JsonResult() {
Data = new
{
now = System.DateTime.Now.ToString("dd HH:mm:ss.ff"),
id,
param1,
param2
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
}
}
Global.asax.cs: custom regis global RateLimit configuration/// ...
using RateLimit; // use RateLimit package
using RateLimit.Configs; // use RateLimit package configuration
namespace WebMVC
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
/// ...
/// ...
/* Full global config */
RateLimitContext.RegisterConfig(
new RateLimitConfig(
/* Global config for request rate */
rateConfig: new RequestRateConfig
{
BlockMessage = "You are making too many request, please try after 60 second",
BlockTime = 60,
CookieName = "ASP.NET_SessionId",
MaxRequestPerPeriod = 1,
PeriodTime = 10,
},
/* Cache config, default is new HttpRuntimeConfig() */
cacheConfig: new RedisConfig()
{
CacheTimeSecond = 3600,
ConnectTimeoutSecond = 5,
DatabaseIndex = 0,
EndPoints = "localhost:6379"
}
)
);
}
}
}HomeController.cs: Use default global rate configuration/// ...
using RateLimit; // use RateLimit package
namespace WebMVC.Controllers
{
public class HomeController : Controller
{
/* Use default global rate configuration */
[RateLimit]
public string GetReport(string param1)
{
return param1;
}
}
}