ASP.NET MVC限制同一个IP地址单位时间间隔内的请求次数

这篇文章介绍了ASP.NET MVC限制同一个IP地址单位时间间隔内请求次数的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

有时候,当用户请求一个Controller下的Action,我们希望,在单位时间间隔内,比如每秒,每分钟,每小时,每天,每星期,限制同一个IP地址对某个Action的请求次数。如何做呢?

stefanprodan的MvcThrottle能很好地解决这个问题,以及其它类型的IP限制问题。在这里:https://github.com/stefanprodan/MvcThrottle

把项目从GitHub下载下来,在本地打开。

找到MvcThrottle类库,打开ThrottlingFilter这个类,在该类的OnActionExecuting方法中修改如下:

                        //check if limit is reached if (rateLimit > 0 && throttleCounter.TotalRequests > rateLimit) { //log blocked request if (Logger != null) Logger.Log(ComputeLogEntry(requestId, identity, throttleCounter, rateLimitPeriod.ToString(), rateLimit, filterContext.HttpContext.Request)); //break execution and return 409 var message = string.IsNullOrEmpty(QuotaExceededMessage) ? "HTTP request quota exceeded! maximum admitted {0} per {1}" : QuotaExceededMessage; //add status code and retry after x seconds to response filterContext.HttpContext.Response.StatusCode = (int)QuotaExceededResponseCode; filterContext.HttpContext.Response.Headers.Set("Retry-After", RetryAfterFrom(throttleCounter.Timestamp, rateLimitPeriod)); filterContext.Result = QuotaExceededResult( filterContext.RequestContext, string.Format(message, rateLimit, rateLimitPeriod), QuotaExceededResponseCode, requestId); return; }

把以上替换成

                        //check if limit is reached if (rateLimit > 0 && throttleCounter.TotalRequests > rateLimit) { filterContext.HttpContext.Response.Redirect("/Error.html"); return; }  

让其在超过次数时,跳转到项目根目录下的Error.html文件。

生成该类库,类库MvcThrottle.dll生成在类库的bin/Debug文件夹下。

在ASP.NET MVC 4 下创建一个项目。

在项目根目录下创建一个Library文件夹,把刚才的MvcThrottle.dll拷贝其中。

引用Library文件夹下的MvcThrottle.dll组件。

在App_Start文件夹中,修改FilterConfig类如下:

    public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { var throttleFilter = new ThrottlingFilter { Policy = new ThrottlePolicy(perSecond: 1, perMinute: 10, perHour: 60 * 10, perDay: 600 * 10) { IpThrottling = true }, Repository = new CacheRepository() }; filters.Add(throttleFilter); } }

创建HomeController,编写如下:

    public class HomeController : Controller { public ActionResult Index() { return View(); } [EnableThrottling(PerSecond = 2, PerMinute = 5, PerHour = 30, PerDay = 300)] public ActionResult Other() { return View(); } [HttpPost] [EnableThrottling(PerSecond = 2, PerMinute = 5, PerHour = 30, PerDay = 300)] public ActionResult GetSth() { return Json(new {msg=true}); } }

生成解决方案。

报错了!What Happened?

原来MvcThrottle是ASP.NET MVC 5下开发的。

有办法。重新打开MvcThrottle项目的类库,在引用中删除原来的System.Web.Mvc,重新引用本地ASP.NET MVC4版本,重新引用本地的System.Web.Mvc。

重新生成类库,重新拷贝到Library文件夹下,成功生成解决方案。

在Home/Index.cshtml视图中:

@{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } 

Index

@section scripts { }

当在单位时间间隔内超过规定次数,就弹出"请求次数过多"提示框。

在Home/Other.cshtml视图中:

@{ ViewBag.Title = "Other"; Layout = "~/Views/Shared/_Layout.cshtml"; } 

Other

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对0133技术站的支持。如果你想了解更多相关内容请查看下面相关链接

以上就是ASP.NET MVC限制同一个IP地址单位时间间隔内的请求次数的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » ASP编程