/// <summary>
/// Decorates any MVC route that needs to have client requests limited by time.
/// </summary>
/// <remarks>
/// Uses the current System.Web.Caching.Cache to store each client request to the decorated route.
/// </remarks>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class ThrottleAttribute : ActionFilterAttribute
{
/// <summary>
/// A unique name for this Throttle.
/// </summary>
/// <remarks>
/// We'll be inserting a Cache record based on this name and client IP, e.g. "Name-192.168.0.1"
/// </remarks>
public string Name { get; set; } /// <summary>
/// The number of seconds clients must wait before executing this decorated route again.
/// </summary>
public int Seconds { get; set; } /// <summary>
/// A text message that will be sent to the client upon throttling. You can include the token {n} to
/// show this.Seconds in the message, e.g. "Wait {n} seconds before trying again".
/// </summary>
public string Message { get; set; } public override void OnActionExecuting(ActionExecutingContext c)
{
var key = string.Concat(Name, "-", c.HttpContext.Request.UserHostAddress);
var allowExecute = false; if (HttpRuntime.Cache[key] == null)
{
HttpRuntime.Cache.Add(key,
true, // is this the smallest data we can have?
null, // no dependencies
DateTime.Now.AddSeconds(Seconds), // absolute expiration
Cache.NoSlidingExpiration,
CacheItemPriority.Low,
null); // no callback allowExecute = true;
} if (!allowExecute)
{
if (String.IsNullOrEmpty(Message))
Message = "You may only perform this action every {n} seconds."; c.Result = new ContentResult { Content = Message.Replace("{n}", Seconds.ToString()) };
// see 409 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
c.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
}
}
}
[Throttle(Name="TestThrottle", Message = "You must wait {n} seconds before accessing this url again.", Seconds = 5)]
public ActionResult TestThrottle()
{
return Content("TestThrottle executed");
}

最新文章

  1. Struts2 源码分析——配置管理之ContainerProvider接口
  2. Json格式应用
  3. 利用webview实现在andorid中嵌入swf
  4. 我的PhoneGap安装配置经历
  5. 函数的定义和声明以及this
  6. [推荐]DDOS攻击与防范知识介绍
  7. 53个要点提高PHP编程效率
  8. 完整实例(C# Socket)
  9. ActiveMQ(5.10.0) - Spring Support
  10. Win7 U盘安装Ubuntu16.04 双系统
  11. [Computer Vision] SIFT特征学习笔记
  12. github上的一些Delphi开源项目
  13. cordova安装--创建ionic项目
  14. 【Unity技能】做一个简单的NPC
  15. Chapter 1 First Sight——17
  16. HTML 5 &lt;embed&gt; 标签
  17. [学习笔记]Java代码中各种类型变量的内存分配机制
  18. 【opencv基础】Rect类的神奇用法
  19. BZOJ5071 小A的数字
  20. Linux网络流量控制工具—Netem

热门文章

  1. PullToRefreshGridView刷新加载
  2. ODBC与ADO 连SQL Server 2005
  3. 【转载】App.config/Web.config 中特殊字符的处理
  4. Object有哪些公用方法?
  5. linux 纯字符界面显示中文
  6. spring访问静态资源出错,No mapping found for HTTP request with URI xxx/resources/js/jquery.min.js...
  7. 【Summary】ANSYS TRANSIENT ANALYSIS
  8. 前端学习 第五弹: CSS (一)
  9. Pyhton的发展历程
  10. mybatis 与 缓存