Вопрос

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

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

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. ListRespondents будет укореняться и, следовательно, будет иметь время жизни приложения. Если есть множество элементов, которые добавляются, следов памяти будет продолжаться. Итак, скорее всего подходит к количеству предметов в этом списке.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top