Я создаю сайт MVC ASP.NET, где я хочу ограничить, как часто аутентифицируемые пользователи могут использовать некоторые функции сайта.
Хотя я понимаю, как ограничение уровня работает существенно, я не могу визуализировать, как реализовать его программно, не создавая главный запах кода.
Можно ли указать на меня к простому все же мощному решению для приближения к такой проблеме с примером кода C#?
Если это имеет значение, все эти функции в настоящее время выражаются как Действия, которые только принимают HTTP POST
. Я могу в конечном счете хотеть реализовать ограничение уровня для HTTP GET
функции также, таким образом, я ищу решение, которое работает на все такие обстоятельства.
Если вы используете IIS 7, вы можете взглянуть на Расширение динамических ограничений IP . Другой вариант - реализовать это как фильтр действий:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class RateLimitAttribute : ActionFilterAttribute
{
public int Seconds { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Using the IP Address here as part of the key but you could modify
// and use the username if you are going to limit only authenticated users
// filterContext.HttpContext.User.Identity.Name
var key = string.Format("{0}-{1}-{2}",
filterContext.ActionDescriptor.ControllerDescriptor.ControllerName,
filterContext.ActionDescriptor.ActionName,
filterContext.HttpContext.Request.UserHostAddress
);
var allowExecute = false;
if (HttpRuntime.Cache[key] == null)
{
HttpRuntime.Cache.Add(key,
true,
null,
DateTime.Now.AddSeconds(Seconds),
Cache.NoSlidingExpiration,
CacheItemPriority.Low,
null);
allowExecute = true;
}
if (!allowExecute)
{
filterContext.Result = new ContentResult
{
Content = string.Format("You can call this every {0} seconds", Seconds)
};
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
}
}
}
А затем украсить действие, которое необходимо ограничить:
[RateLimit(Seconds = 10)]
public ActionResult Index()
{
return View();
}
Взгляните на ответ Джаррода о том, как они это делают на SO.
Некоторые примеры кода, а также объяснение того, как это работает.