La meilleure façon de mettre en œuvre la limitation des requêtes en ASP.NET MVC?

StackOverflow https://stackoverflow.com/questions/33969

  •  09-06-2019
  •  | 
  •  

Question

Nous sommes à expérimenter avec différentes façons de limiter les actions de l'utilisateur dans un période de temps donnée:

  • Limite de question/réponse postes
  • Limite de modifications
  • Limite de nourrir les récupérations

Pour le moment, nous sommes en utilisant le Cache de simplement insérer un enregistrement de l'activité de l'utilisateur - si l'enregistrement existe si/lorsque l'utilisateur effectue la même activité, nous avons la manette des gaz.

En utilisant le Cache automatiquement nous donne des données obsolètes de nettoyage et de glissement de l'activité windows de utilisateurs, mais comment il pourrait être un problème.

Quelles sont les autres façons de s'assurer que les demandes/les actions de l'utilisateur peuvent être efficacement étranglé (accent mis sur la stabilité)?

Était-ce utile?

La solution

Voici une version générique de ce que nous avons été à l'aide sur un Débordement de Pile pour l'année écoulée:

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

Exemple d'utilisation:

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

L'ASP.NET Cache fonctionne comme un champion ici - en l'utilisant, vous obtenez automatiquement le nettoyage de votre manette des gaz entrées.Et avec l'augmentation de notre trafic, nous ne voyons pas que c'est un problème sur le serveur.

N'hésitez pas à donner des commentaires sur cette méthode;quand nous faisons de Débordement de Pile mieux, vous obtenez vos Ewok fix encore plus rapide :)

Autres conseils

Microsoft a une nouvelle extension pour IIS 7, appelée IP Dynamique des Restrictions Extension pour IIS 7.0 Bêta.

"La Dynamique des Restrictions IP pour IIS 7.0 est un module qui fournit une protection contre le déni de service et les attaques par force brute sur le serveur web et des sites web.Cette protection est assurée par bloquant temporairement les adresses IP des clients HTTP qui font un nombre inhabituellement élevé de demandes simultanées ou qui font un grand nombre de requêtes sur une petite période de temps." http://learn.iis.net/page.aspx/548/using-dynamic-ip-restrictions/

Exemple:

Si vous définissez les critères à bloc après X requests in Y milliseconds ou X concurrent connections in Y milliseconds l'adresse IP sera bloquée pour Y milliseconds les demandes seront de nouveau autorisé.

Nous utilisons la technique emprunté à partir de cette URL http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx, pas de limitation, mais pour un homme pauvre Déni De Service (D. O. S).C'est également en cache, et peut-être similaire à ce que vous faites.Êtes-vous de la limitation pour empêcher la D. O. S.les attaques?Les routeurs peuvent certainement être utilisé pour réduire les D. O. S;pensez vous que le routeur peut gérer l'étranglement dont vous avez besoin?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top