Asp.Net Mvc ile geliştirdiğim projede kullandığım yapı. Bu yapıyla controller'a gelen istek sayısını kısıtlayabiliyorum ancak dediğiniz veri çekme olayını metodun içerisinde yaparsanız daha doğru olabilir.
Örneğin Handle sayfasına bir tarayıcıdan dakikada 40 istek yapıldığında 41. isteği engelliyor. bir sonraki dakikada yine istek yapabiliyor ancak saatte 100 isteği geçerse yine engelliyor, 2. saate geldiğinde istek yapmaya devam edebiliyor, günlük 250 istek yaptığında ertesi gün istek yapmaya devam edebilir.
Controller.cs:


[Throttle(TimeUnit = TimeUnit.Minute, Count = 40)]
[Throttle(TimeUnit = TimeUnit.Hour, Count = 100)]
[Throttle(TimeUnit = TimeUnit.Day, Count = 250)]
public class HandleController : Controller
{
// kodlar..........
}

Throttle.cs:
public enum TimeUnit
{
Minute = 60,
Hour = 3600,
Day = 86400
}

[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public class ThrottleAttribute : ActionFilterAttribute
{
public TimeUnit TimeUnit { get; set; }
public int Count { get; set; }

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var seconds = Convert.ToInt32(TimeUnit);

var key = string.Join(
"-",
seconds,
filterContext.HttpContext.Request.HttpMethod,
filterContext.ActionDescriptor.ControllerDescripto r.ControllerName,
filterContext.ActionDescriptor.ActionName,
filterContext.HttpContext.Request.UserHostAddress
);

// increment the cache value
var cnt = 1;
if (HttpRuntime.Cache[key] != null)
{
cnt = (int)HttpRuntime.Cache[key] + 1;
}
HttpRuntime.Cache.Insert(
key,
cnt,
null,
DateTime.UtcNow.AddSeconds(seconds),
Cache.NoSlidingExpiration,
CacheItemPriority.Low,
null
);

if (cnt > Count)
{

filterContext.Result = new JsonResult { ContentType = "application/json", Data = new Mesaj { tur = MesajTuru.Uyari, mesaj = "You are allowed to make only " + Count + " requests per " + TimeUnit.ToString().ToLowerInvariant() }, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
filterContext.HttpContext.Response.StatusCode = 429;
return;
}
base.OnActionExecuting(filterContext);
return;
}

}