Хорошо, чтобы реализовать событие .NET на IHttpModule? - PullRequest
1 голос
/ 07 ноября 2010

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

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

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...
}

1 Ответ

1 голос
/ 07 ноября 2010

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

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

Следующим может быть шоу-стоппер ...

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

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

...