2008-08-29 1 views
194

Мы экспериментируем с различными способами для дроссельных действий пользователя в определенный период времени:Лучший способ реализовать регулирование запроса в ASP.NET MVC?

  • Ограничить сообщений Вопрос/ответ
  • Limit редактирует
  • подающие Limit извлечений

Для в настоящее время мы используем кеш, чтобы просто вставить запись о деятельности пользователя - если эта запись существует, если/когда пользователь выполняет ту же операцию, мы дросселируем.

Использование кэша автоматически дает нам устаревшие данные для очистки и скольжения окон активности пользователей, но то, как это будет масштабироваться, может быть проблемой.

Каковы другие способы обеспечения эффективного демпфирования запросов/действий пользователя (упор на стабильность)?

+0

Вы пытаетесь ограничить пользователя или вопрос? Если на одного пользователя можно использовать сеанс, который будет меньшим. – 2008-11-02 01:23:53

+1

Это для пользователя, но мы не могли использовать Session, так как для этого требуются файлы cookie - в настоящее время мы ограничиваем IP-адрес. – 2008-11-13 02:20:59

ответ

217

Вот общая версия о том, что мы использовали на переполнение стека за последний год: использование

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

Пример:

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

Кэш ASP.NET работает как чавканье здесь - используя его, вы получаете автоматическую очистку ваших записей дроссельной заслонки. И с нашим растущим трафиком мы не видим, что это проблема на сервере.

Не стесняйтесь сообщать об этом методе; когда мы делаем Stack Overflow лучше, вы получаете свой Ewok fix еще быстрее :)

9

Мы используем технику, заимствованную с этого URL-адреса http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx, а не для дросселирования, но для Отклонения Службы Бедности (D.O.S). Это также основано на кеше и может быть похоже на то, что вы делаете. Вы дросселируете, чтобы предотвратить D.O.S. атаки? Маршрутизаторы, безусловно, могут быть использованы для уменьшения D.O.S; вы думаете, что маршрутизатор может справиться с дросселированием, в котором вы нуждаетесь?

+1

Это в значительной степени то, что мы уже делаем, но оно отлично работает :) – 2009-01-11 05:45:16

67

Microsoft имеет новое расширение для IIS 7 под названием Dynamic IP Restrictions Extension для IIS 7.0 - бета-версия.

«Ограничения, Dynamic IP для IIS 7.0 представляет собой модуль, который обеспечивает защиту от отказа в обслуживании и грубой силы нападения на веб-сервере и веб-сайтов. Такая защита обеспечивается путем временного блокирования IP-адресов HTTP клиентов, которые делают необычно большое количество одновременных запросов или кто делает большое количество запросов в течение небольшого периода времени ». http://learn.iis.net/page.aspx/548/using-dynamic-ip-restrictions/

Пример:

Если установить критерии для блокировки после X requests in Y milliseconds или X concurrent connections in Y milliseconds IP-адрес будет заблокирован Y milliseconds то запросы будут разрешены снова.

+1

Знаете ли вы, что это вызвало проблемы с сканерами, такими как робот Google? – Helephant 2013-08-23 13:17:18

Смежные вопросы