tutorial route net mvc entre ejemplos diferencias data asp all asp.net-mvc throttling

route - ¿La mejor manera de implementar la limitación de solicitudes en ASP.NET MVC?



web forms c# tutorial (3)

Estamos experimentando con varias formas de estrangular las acciones de los usuarios en un período de tiempo determinado :

  • Limitar mensajes de preguntas / respuestas
  • Limitar ediciones
  • Limitar las recuperaciones de alimento

Por el momento, estamos usando el Caché para simplemente insertar un registro de la actividad del usuario: si ese registro existe si / cuando el usuario realiza la misma actividad, aceleramos.

El uso de la memoria caché nos proporciona automáticamente la limpieza de datos obsoletos y las ventanas de actividad deslizantes de los usuarios, pero su escala podría ser un problema.

¿Cuáles son algunas otras formas de asegurar que las solicitudes / acciones de los usuarios puedan ser efectivamente reducidas (énfasis en la estabilidad)?


Aquí hay una versión genérica de lo que hemos estado usando en durante el año pasado:

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

Uso de la muestra:

[Throttle(Name="TestThrottle", Message = "You must wait {n} seconds before accessing this url again.", Seconds = 5)] public ActionResult TestThrottle() { return Content("TestThrottle executed"); }

El Caché de ASP.NET funciona como un campeón aquí. Al usarlo, obtiene una limpieza automática de sus entradas del acelerador. Y con nuestro creciente tráfico, no vemos que esto sea un problema en el servidor.

Siéntase libre de dar su opinión sobre este método; cuando hacemos que sea mejor, obtienes tu Ewok fix aún más rápido :)


Microsoft tiene una nueva extensión para IIS 7 llamada Extensión de restricciones de IP dinámica para IIS 7.0 - Beta.

"Las restricciones de IP dinámica para IIS 7.0 es un módulo que brinda protección contra los ataques de denegación de servicio y de fuerza bruta en el servidor web y los sitios web. Esta protección se proporciona mediante el bloqueo temporal de las direcciones IP de los clientes HTTP que realizan un número inusualmente alto de solicitudes concurrentes. o que hacen un gran número de solicitudes en un corto período de tiempo ". http://learn.iis.net/page.aspx/548/using-dynamic-ip-restrictions/

Ejemplo:

Si configura los criterios para bloquear después de X requests in Y milliseconds o X concurrent connections in Y milliseconds la dirección IP se bloqueará durante Y milliseconds entonces se volverán a permitir las solicitudes.


Utilizamos la técnica tomada de esta URL http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx , no para la regulación, sino para la Denegación de Servicio (DOS) de un hombre pobre. Esto también está basado en caché y puede ser similar a lo que está haciendo. ¿Estás acelerando para evitar los ataques de DOS? Los enrutadores pueden usarse para reducir DOS; ¿Crees que un enrutador podría manejar la regulación que necesitas?