2010-11-07 4 views
1

Я объявлял событие на HTTP-модуле, поэтому он будет опросить подписчиков за истинное/ложное значение, чтобы определить, следует ли ему выполнить свою задачу по настройке HTTP-ответа. Если только один абонент отвечает на true, тогда он выполняет свою логику.Хорошо реализовать .NET-событие на IHttpModule?

Имеет ли это смысл?
Есть ли потенциальные ловушки, которых я не вижу?

public class ResponseTweaker : IHttpModule { 

    // to be a list of subscribers 
    List<Func<HttpApplication, bool>> listRespondants = new List<Func<HttpApplication, bool>>(); 

    // event that stores its subscribers in a collection 
    public event Func<HttpApplication, bool> RequestConfirmation { 
     add { 
      listRespondants.Add(value); 
     } 
     remove { 
      listRespondants.Remove(value); 
     } 
    } 

    public void Init(HttpApplication context) { 
     if (OnGetAnswer(context)) // poll subscribers ... 
      // Conditionally Run Module logic to tweak Response ... 
    } 

    /* Method that polls subscribers and returns 'true' 
    * if only one of them answers yes. 
    */ 
    bool OnGetAnswer(HttpApplication app) { 
     foreach (var respondant in listRespondants) 
      if (respondant(app)) 
       return true; 
     return false; 
    } 

    // etc... 
} 
+0

Не совсем ловушкой, но вы, вероятно, получите немного более высокую производительность, если вы используете [HashSet] (http://msdn.microsoft.com/en-us/library/bb359438.aspx) (с порядка не имеет значения). И вам не нужно внешнее, если в 'OnGetAnswer', так как безопасно перебирать пустой список или набор. –

+0

@Matthew F: Спасибо. Я удалил избыточное 'if'. Вы можете быть правы в HashSet, но я не ожидаю, что у вас будет много подписчиков, а тем более для них, чтобы удалить себя, поэтому я оставлю это как список на данный момент. –

+1

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

ответ

1

Я не думаю, что это хорошая идея. Количество вопросов будет зависеть от некоторых факторов, таких как ...

  1. listRespondants будет укоренен и, следовательно, будет иметь срок службы приложения. Если есть куча предметов, которые добавляются, объем памяти будет увеличиваться. Таким образом, это скорее снизится до количества элементов в этом списке.

Ниже можно показать пробкой ...

  1. IISReset или рециркуляционный Application Domain удалит всю эту информацию из вашего приложения. Как вы планируете возвращать элементы в этом списке? База данных?

  2. Что делать, если у вас есть веб-ферма. Это приложение не будет работать так, как ожидалось, в тот момент, когда вы попытаетесь уменьшить масштаб. Причина в том, что ... даже если у вас есть тот же модуль, загруженный на всех серверах веб-фермы, данные в Worker Process являются локальными. Следовательно, listRespondants будет отличаться на всех ваших серверах, если вы не загружаете его из какой-либо базы данных.