আমরা গত এক বছর ধরে স্ট্যাক ওভারফ্লোতে যা ব্যবহার করছি তার জেনেরিক সংস্করণ এখানে রয়েছে:
/// <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");
}
এএসপি.এনইটি ক্যাশে এখানে চ্যাম্পের মতো কাজ করে - এটি ব্যবহার করে আপনি আপনার থ্রটল এন্ট্রিগুলিতে স্বয়ংক্রিয়ভাবে ক্লিন-আপ পাবেন। এবং আমাদের ক্রমবর্ধমান ট্র্যাফিকের সাথে আমরা এটি দেখতে পাচ্ছি না যে এটি সার্ভারে একটি সমস্যা।
এই পদ্ধতিতে মতামত জানাতে নির্দ্বিধায়; যখন আমরা স্ট্যাক ওভারফ্লো আরও ভাল করি তখন আপনি আপনার ইওক আরও দ্রুত বাড়িয়ে তুলবেন :)