在ASP.NET MVC下限制同一个IP地址单位时间间隔内的请求次数的解决方法

 更新时间:2024年01月03日 15:12:40   作者:白沙王  
有时候,当用户请求一个Controller下的Action,我们希望,在单位时间间隔内,比如每秒,每分钟,每小时,每天,每星期,限制同一个IP地址对某个Action的请求次数,如何做呢?这篇文章主要介绍了在ASP.NET MVC下限制同一个IP地址单位时间间隔内的请求次数,需要的朋友可以参考下

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

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

stefanprodan的MvcThrottle能很好地解决这个问题,以及其它类型的IP限制问题。在这里:GitHub - stefanprodan/MvcThrottle: ASP.NET MVC Throttling filter
把项目从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>

当在单位时间间隔内超过规定次数,就跳转到预定的Error.html页了。

到此这篇关于在ASP.NET MVC下限制同一个IP地址单位时间间隔内的请求次数的解决方法的文章就介绍到这了,更多相关ASP.NET MVC请求次数限制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • asp.net 读取Excel数据到DataTable的代码

    asp.net 读取Excel数据到DataTable的代码

    asp.net 读取Excel数据到DataTable的代码,需要的朋友可以参考下。
    2010-03-03
  • .NET医院公众号系统线程CPU双高问题分析

    .NET医院公众号系统线程CPU双高问题分析

    这篇文章主要介绍了.NET医院公众号系统 线程CPU双高分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • ASP.NET 性能优化之反向代理缓存使用介绍

    ASP.NET 性能优化之反向代理缓存使用介绍

    今天我们将要讲到的是大型站点的一种常用做法,将缓存部署在反向代理服务器上,这类缓存我们通常称之为反向代理缓存
    2011-10-10
  • .Net使用Cancellation Framework取消并行任务

    .Net使用Cancellation Framework取消并行任务

    这篇文章介绍了.Net使用Cancellation Framework取消并行任务的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 轻量级ORM框架Dapper应用之实现In操作

    轻量级ORM框架Dapper应用之实现In操作

    这篇文章介绍了使用Dapper实现In操作的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • .NET连接数据库以及基本的增删改查操作教程

    .NET连接数据库以及基本的增删改查操作教程

    这篇文章主要给大家介绍了关于.NET连接数据库以及基本的增删改查操作教程的相关资料,对于刚入门的新手们来说是个很好的入门教程,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-01-01
  • 详解.Net Core中的日志组件(Logging)

    详解.Net Core中的日志组件(Logging)

    这篇文章主要介绍了详解.Net Core中的日志组件(Logging),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • ASP.NET递归法求阶乘解决思路

    ASP.NET递归法求阶乘解决思路

    递归就是在过程或函数里调用自身,在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序
    2012-12-12
  • Asp.net 2.0 无刷新图片上传 显示缩略图 具体实现

    Asp.net 2.0 无刷新图片上传 显示缩略图 具体实现

    简单三步实现图片无刷新上传:注意是上传,至于上传时的验证,比如图片的尺寸,大小,格式。自行解决。如果我搞定了,也会贴上来的。
    2013-06-06
  • 一文搞懂MemoryCache 清除全部缓存的方法

    一文搞懂MemoryCache 清除全部缓存的方法

    这篇文章主要介绍了MemoryCache 清除全部缓存的方法,本文给大家介绍两个方法,每种方法通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12

最新评论