Я создавал модуль http, и во время отладки я заметил что-то, что сначала (по крайней мере) казалось странным поведением.
Когда я устанавливаю точку останова в методе init httpmodule, я вижу, что метод init модуля http вызывается несколько раз, хотя я только запустил веб-сайт для отладки и сделал один единственный запрос (иногда он попадает только 1 раз, в других случаях - 10 раз).
Я знаю, что я должен ожидать, что будут запущены несколько экземпляров HttpApplication, и для каждого из них будут созданы http-модули, но когда я запрашиваю одну страницу, она должна обрабатываться одним объектом приложения http и, следовательно, только запускать события связанный один раз, но все же он вызывает события несколько раз для каждого запроса, что не имеет смысла - кроме того, что он должен был быть добавлен несколько раз в течение этого httpApplication, что означает, что это тот же самый метод init httpmodule, который вызывается каждый раз, а не новое приложение http, создаваемое каждый раз, когда оно попадает в мою точку разрыва (см. мой пример кода внизу и т.д.).
Что здесь может быть неправильным? это потому, что я отлаживаю и устанавливаю точку останова в модуле http?
Он заметил, что кажется, что если я запустил веб-сайт для отладки и быстро перешагнул точку останова в httpmodule, он только ударит по методу init один раз и тот же будет для обработчика событий. Если я вместо этого позволю ему зависнуть в точке останова в течение нескольких секунд, метод init вызывается несколько раз (похоже, это зависит от того, сколько времени я жду, прежде чем переходить на точку останова). Возможно, это может быть некоторая функция сборки, чтобы убедиться, что httpmodule инициализирован, и приложение http может обслуживать запросы, но это также похоже на то, что может иметь катастрофические последствия.
Это может показаться логичным, поскольку это может быть попытка завершить запрос, и поскольку я установил точку останова, он думает, что что-то пошло не так, и попробуйте снова вызвать метод init. soo может обрабатывать запрос?
Но это то, что происходит, и все прекрасно (я просто догадываюсь), или это настоящая проблема?
То, что меня особенно беспокоит, заключается в том, что если что-то заставляет его зависать на сервере "production/live" в течение нескольких секунд, через init запускается много обработчиков событий, и поэтому каждый запрос на страницу внезапно запускает обработчик событий несколькими раз.
Такое поведение может быстро привести к удалению любого сайта.
Я просмотрел "исходный".net-код, используемый для httpmodules для проверки форм, и rolemanagermodule и т.д., но мой код не отличается от того, что используют эти модули.
Мой код выглядит следующим образом.
public void Init(HttpApplication app)
{
if (CommunityAuthenticationIntegration.IsEnabled)
{
FormsAuthenticationModule formsAuthModule = (FormsAuthenticationModule) app.Modules["FormsAuthentication"];
formsAuthModule.Authenticate += new FormsAuthenticationEventHandler(this.OnAuthenticate);
}
}
вот пример того, как это делается в модуле RoleManagerModule из платформы .NET
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, который в настоящее время остановлен на точка останова).
Я думаю или надеюсь, что это может быть какой-то разумный способ "за кулисами" помочь распределить и обработать нагрузку и/или ошибки. Но я понятия не имею. Я надеюсь, что некоторые там могут заверить меня, что это прекрасно и как это должно быть?