Pregunta

Estoy construyendo un sitio ASP.NET MVC donde quiero limitar la frecuencia con usuarios autenticados pueden utilizar algunas funciones del sitio.

A pesar de que entiendo lo que limita la velocidad de obras, fundamentalmente, no se puede visualizar cómo implementar mediante programación sin crear un gran olor código.

Puede que punto hacia una sencilla pero potente solución para abordar un problema tal, con el código C # muestra me

Si es importante, todas estas funciones se expresan actualmente como acciones que sólo aceptan HTTP POST. Puede que con el tiempo que desee implementar limitante de la velocidad para las funciones HTTP GET también, así que estoy buscando una solución que funcione para todas las circunstancias.

¿Fue útil?

Solución

Si está utilizando IIS 7 que podría echar un vistazo a la Restricciones de IP dinámica Extensión . Otra posibilidad es implementar esto como un filtro de acción:

[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;
        }
    }
}

Y luego decorar la acción que necesita ser limitadas:

[RateLimit(Seconds = 10)]
public ActionResult Index()
{
    return View();
}

Otros consejos

Para consultar la respuesta de Jarrod sobre cómo lo hacen en el SO.

Stackoverflow MVC Throttling

Algunos ejemplos de código, así como la explicación de cómo funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top