Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 16308|Ответ: 0

[ASP.NET] [Миф] Будет ли метод Init объекта HttpApplication выполняться только один раз?

[Скопировать ссылку]
Опубликовано 06.02.2017 17:29:28 | | | |
Я обнаружил, что многие друзья, как и я, ошибочно использовали IHttpModule.Init как Application_Start альтернативу для выполнения операций инициализации приложений.
Однако характер событий Application_Start в IHttpModule.Init и Global.asax отличается, и IHttpModule.Init нельзя использовать напрямую для замены процесса инициализации Application_Start ASP.NET приложения. Также нельзя просто сделать вывод, что метод Init неоднократно вызывается для вывода о том, что ASP.NET программа была перезапущена.
Причина в том, что IHttpModule.Init может вызываться несколько раз при ответе на запрос ASP.NET, и это очень вероятно происходит во время работы сайта.
Почему IHttpModule.Init вызывается несколько раз? Каждый экземпляр HttpApplication может обрабатывать только один запрос одновременно, а ASP.NET поддерживает определённое количество одновременных запросов, поэтому экземпляр HttpApplication будет создаваться несколько раз для ответа на разные запросы, когда недостаточно для ответа на одновременные запросы. Каждый экземпляр HttpApplication создаёт новый набор HttpModules и вызывает метод Init после создания.
Application_Start будет вызван только после создания первого объекта HttpApplication, и последующие экземпляры HttpApplication не будут запускать это событие.
Я считаю, что повторное использование экземпляров HttpApplication — одна из главных причин неправильного понимания метода Init в IHttpModule, потому что обычно при отладке программы есть только один запрос, и практически невозможно многократно выполнять метод Init от HttpModule. В реальной среде работы сайта одновременные запросы распространены, и если метод Init используется неправильно, это может вызвать странные проблемы в реальной среде.
Для получения конкретной информации, пожалуйста, обратитесь к статье MSDN «Обзор жизненного цикла ASP.NET приложения для IIS 5.0 и 6.0», где приведены изображения в статье:
Вы также можете использовать Refelector для декомпиляции ассемблера System.Web и анализа связей вызовов метода IHttpModule.Init.
В итоге вы получите метод System.Web.HttpApplicationFactory.GetNormalApplicationInstance, который показывает, как используются и создаются экземпляры HttpApplication.
В итоге, IHttpModule.Init нельзя просто использовать как замену Application_Start.
Относительно простой способ — использовать статическое поле типа bool в качестве инициализации и установить метку true после инициализации, требуемой программой в HttpModule, и не повторять инициализацию в следующий раз.
Однако код, например регистрация события BeginRequest, всё равно должен выполняться каждый раз при выполнении Init, потому что экземпляр HttpModule в данный момент отличается: если рассматривать поле разметки статической инициализации без повторения события регистрации, это приведёт к странным проблемам, например, к переписыванию URL иногда выполняется, а иногда нет.

[Миф] Будет ли метод Init объекта HttpApplication выполняться только один раз?

Ответ: Он будет выполняться несколько раз!!!!





Предыдущий:Используйте InternalsVisibleTo для добавления «friend assembly» в ассемблер
Следующий:Java regex конкурс на выбор красивого числа
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com