ASP.NET MVC限制同一个IP地址单位时间间隔内的请求次数(asp和.net)速看

随心笔谈2年前发布 编辑
180 0
🌐 经济型:买域名、轻量云服务器、用途:游戏 网站等 《腾讯云》特点:特价机便宜 适合初学者用 点我优惠购买
🚀 拓展型:买域名、轻量云服务器、用途:游戏 网站等 《阿里云》特点:中档服务器便宜 域名备案事多 点我优惠购买
🛡️ 稳定型:买域名、轻量云服务器、用途:游戏 网站等 《西部数码》 特点:比上两家略贵但是稳定性超好事也少 点我优惠购买



有时候,当用户请求一个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”;
}
<h2>Index</h2>
<input type=”button” id=”btn” value=”请求”/>
@section scripts
{
<script type=”text/javascript”>
$(function() {
$(‘#btn’).on(“click”, function() {
$.post(‘@Url.Action(“GetSth”)’,function(data) {
if (data.msg) {
alert(“请求成功一次”);
} else {
alert(“请求次数过多”);
}
});
});
});
</script>
}

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

在Home/Other.cshtml视图中:

@{
ViewBag.Title=”Other”;
Layout=”~/Views/Shared/_Layout.cshtml”;
}
<h2>Other</h2>

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

您可能感兴趣的文章:ASP.NET?MVC使用异步Action的方法ASP.NET?MVC遍历验证ModelState的错误信息ASP.NET?MVC使用Session会话保持表单状态ASP.NET?MVC实现下拉框多选ASP.NET?MVC使用Quartz.NET执行定时任务ASP.NET MVC视图页使用jQuery传递异步数据的几种方式详解ASP.NET?MVC通过勾选checkbox更改select的内容ASP.NET?MVC使用Log4Net记录异常日志并跳转到静态页ASP.NET?MVC实现树形导航菜单ASP.NET?MVC扩展带验证的单选按钮

© 版权声明

相关文章