Я создавал модуль http и во время отладки заметил что-то, что поначалу (по крайней мере) казалось странным поведением.
Когда я устанавливаю точку останова в методе инициализации модуля httpmodule, я вижу, что метод инициализации модуля http вызывается несколько раз, хотя я только запустил веб-сайт для отладки и сделал один единственный запрос (иногда он вызывается только 1 раз, иногда 10 раз).
Я знаю, что я должен ожидать, что будет запущено несколько экземпляров HttpApplication, и для каждого будут созданы модули http, но когда я запрашиваю одну страницу, она должна обрабатываться одним объектом приложения http и, следовательно, запускать только события связан один раз, но все же он запускает события несколько раз для каждого запроса, что не имеет смысла - кроме того, что он должен быть добавлен несколько раз в этом httpApplication - что означает, что это тот же самый метод инициализации httpmodule, который вызывается каждый раз, а не каждое http-приложение создается каждый раз, когда оно достигает моей точки останова (см. мой пример кода внизу и т. д.).
Что здесь может пойти не так? потому что я отлаживаю и устанавливаю точку останова в модуле http?
Замечено, что если я запускаю веб-сайт для отладки и быстро перехожу через точку останова в httpmodule, он срабатывает только один раз в методе init, и то же самое относится и к обработчику событий. Если я вместо этого оставлю его висеть на точке останова на несколько секунд, метод init вызывается несколько раз (похоже, это зависит от того, сколько времени я жду, прежде чем перешагнуть через точку останова). Может быть, это может быть какая-то встроенная функция, чтобы убедиться, что модуль http инициализирован и приложение http может обслуживать запросы, но это также похоже на то, что может иметь катастрофические последствия.
Это может показаться логичным, поскольку он может пытаться завершить запрос, и, поскольку я установил точку останова, он думает, что что-то пошло не так, и пытается снова вызвать метод init? так он может обработать запрос?
Но это то, что происходит, и все в порядке (я просто догадываюсь), или это реальная проблема?
Что меня особенно беспокоит, так это то, что если что-то заставляет его зависать на сервере «production / live» на несколько секунд, то через init добавляется много обработчиков событий, и поэтому каждый запрос к странице внезапно запускает обработчик событий несколько раз. раз.
Такое поведение может быстро сломать любой сайт.
Я посмотрел «оригинальный» .net-код, используемый для http-модулей для проверки подлинности с помощью форм, модуля rolemanager и т. Д., Но мой код не отличается от того, что используют эти модули.
Мой код выглядит следующим образом.
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);
}
}
Кто-нибудь знает, что происходит?
(я просто надеюсь, что кто-то там может сказать мне, почему это происходит, и заверить меня, что все в порядке):)
UPDATE:
Я попытался сузить проблему, и до сих пор я обнаружил, что вызываемый метод Init всегда находится на новом объекте моего http-модуля (в отличие от того, что я думал раньше).
Мне кажется, что для первого запроса (при запуске сайта) все создаваемые объекты HttpApplication и все его модули пытаются обработать первый запрос и, следовательно, все попадают в добавляемый обработчик событий.
Я не могу понять, почему это происходит.
Если я запрашиваю другую страницу, все созданные HttpApplication (и их немодулированные) снова попытаются обработать запрос, вызывая многократное попадание в обработчик событий.
Но также кажется, что если я затем вернусь на первую страницу (или другую), только один HttpApplication начнет заботиться о запросе, и все будет так, как ожидалось - до тех пор, пока я не позволю ему зависнуть на перерыв точка.
Если я позволю ему зависнуть в точке останова, он начинает создавать новые объекты HttpApplication и начинает добавлять HttpApplications (более 1) для обслуживания / обработки запроса (который уже обрабатывается HttpApplication, который в данный момент остановлен на точка останова).
Я предполагаю или надеюсь, что это может быть какой-то интеллектуальный способ "закулисного" помочь распределить и обработать нагрузку и / или ошибки. Но я понятия не имею.
Я надеюсь, что некоторые из них могут заверить меня, что это прекрасно и как это должно быть?