Метод HttpModule Init вызывается несколько раз - почему?

Я создавал модуль http и во время отладки заметил что-то, что на первый взгляд (по крайней мере) казалось странным поведением.

Когда я устанавливаю точку останова в методе init модуля httpmodule, я вижу, что метод init модуля http вызывается несколько раз, хотя я только запустил веб-сайт для отладки и сделал один единственный запрос (иногда он срабатывает только 1 раз В других случаях целых 10 раз).

Я знаю, что следует ожидать, что будет запущено несколько экземпляров HttpApplication, и для каждого будут созданы http-модули, но когда я запрашиваю одну страницу, она должна обрабатываться одним объектом приложения http и, следовательно, запускать только события, связанные один раз, но все же он запускает события несколько раз для каждого запроса, что не имеет смысла - кроме того, что он должен быть добавлен несколько раз в этом httpApplication - что означает, что это тот же самый метод инициализации httpmodule, который вызывается каждый раз, а не новое приложение http создается каждый раз, когда он достигает моей точки останова (см. мой пример кода внизу и т. д.).

Что может быть не так? потому что я отлаживаю и устанавливаю точку останова в модуле http?

Он заметил, что если я запускаю веб-сайт для отладки и быстро перехожу через точку останова в модуле http, он будет попадать в метод init только один раз, и то же самое относится и к обработчику событий. Если я вместо этого оставлю его висеть на точке останова на несколько секунд, метод init вызывается несколько раз (похоже, это зависит от того, сколько времени я жду, прежде чем перешагнуть через точку останова). Может быть, это может быть какая-то встроенная функция, чтобы убедиться, что модуль http инициализирован и приложение http может обслуживать запросы, но это также похоже на то, что может иметь катастрофические последствия.

Это может показаться логичным, поскольку он может пытаться завершить запрос, и, поскольку я установил точку останова, он думает, что что-то пошло не так, и пытается снова вызвать метод init? так это может обработать запрос?

Но так ли это, и все нормально (я просто догадываюсь), или это реальная проблема?

Что меня особенно беспокоит, так это то, что если что-то заставляет его зависать на «production / live» В течение нескольких секунд на сервере добавляется много обработчиков событий через init, и поэтому каждый запрос к странице внезапно запускает обработчик событий несколько раз.

Такое поведение может быстро сломать любой сайт.

Я посмотрел на «оригинал» .net код, используемый для http-модулей для проверки подлинности с помощью форм, модуля роль-менеджера и т. д., но мой код ничем не отличается от того, что используют эти модули.

Мой код выглядит так.

    public void Init(HttpApplication app)
    {
        if (CommunityAuthenticationIntegration.IsEnabled)
        {
            FormsAuthenticationModule formsAuthModule = (FormsAuthenticationModule) app.Modules["FormsAuthentication"];         

            formsAuthModule.Authenticate += new FormsAuthenticationEventHandler(this.OnAuthenticate);
        }
    }

Вот пример того, как это делается в RoleManagerModule из .NET Framework

    public void Init(HttpApplication app)
    {
        if (Roles.Enabled)
        {
            app.PostAuthenticateRequest += new EventHandler(this.OnEnter);
            app.EndRequest += new EventHandler(this.OnLeave);
        }
    }

Кто-нибудь знает, что происходит?

(Я просто надеюсь, что кто-то там может сказать мне, почему это происходит, и заверить меня, что все в порядке) :)

ОБНОВИТЬ:

Я попытался сузить проблему и до сих пор обнаружил, что вызываемый метод Init всегда находится на новом объекте моего http-модуля (в отличие от того, что я думал раньше).

Мне кажется, что для первого запроса (при запуске сайта) все создаваемые объекты HttpApplication и все его модули пытаются обработать первый запрос и, следовательно, все попадают в добавляемый обработчик событий. Я не могу понять, почему это происходит.

Если я запрашиваю другую страницу, все созданные HttpApplication (и их модули) снова будут пытаться обработать запрос, заставляя его попадать в обработчик событий несколько раз.

Но также кажется, что если я затем вернусь к первой странице (или другой), только один HttpApplication начнет заботиться о запросе, и все будет так, как ожидалось - до тех пор, пока я не позволю ему зависнуть в точке останова.

Если я позволяю ему зависнуть в точке останова, он начинает создавать новые объекты HttpApplication и начинает добавлять HttpApplications (более 1) для обслуживания / обработки запроса (который уже обрабатывается HttpApplication, который в настоящее время остановлен на контрольная точка).

Я предполагаю или надеюсь, что это может быть какой-то умный "за кадром" способ помочь распределить и обработать нагрузку и / или ошибки. Но я понятия не имею. Я надеюсь, что некоторые из них могут убедить меня, что это прекрасно и как это должно быть?

Ответы на вопрос(4)

Ваш ответ на вопрос