Спонсор: Microsoft
Опубликован: 30.01.2013 | Доступ: свободный | Студентов: 1180 / 138 | Длительность: 17:23:00
Теги: .net, ajax, asp, www, интранет
Лекция 5:

Построение приложений на основе веб-форм ASP.NET Web Forms

Модель событий

Обработка запроса и генерация страницы большой и сложный процесс, который происходит на стороне сервера. При обработке запроса в каждый момент времени сервер выполняет различные действия, которые в общем случае незаметны для пользователя приложения и разработчика. Зачастую для разработчика нет необходимости знать о процессах, которые происходят в рамках среды исполнения. Однако при реализации некоторых механизмов может потребоваться вмешаться в процесс обработки запроса. Например, это может быть необходимо, когда разрабатывается собственная система безопасности или реализуется сложный механизм кэширования страницы. В этом случае нужно каким-то образом вмешаться в процесс разработки и запустить собственный код. Для этих целей в ASP.NET существует модель событий, которая позволяет это сделать. В рамках этой модели существуют предопределенные события, которые запускаются каждый раз при обработке запроса от клиента в строго определенные моменты времени (например, в момент проверки корректности имени пользователя/пароля или в момент запроса данных из кэша).

Все события в модели событий ASP.NET можно разделить на два больших типа:

события страницы – исполняются каждый раз при обработке обращения к странице;
глобальные события – исполняются в момент запуска или остановки приложения.

Рассмотрим механизм работы событий ASP.NET Web Forms, которые генерируются при каждом обращении к странице. Эти события можно разделить на группы, в зависимости от времени исполнения:

  • события, выполняющиеся в момент подготовки к обработке запроса;
  • события, выполняющиеся перед генерацией результата (кода HTML);
  • события, выполняющиеся после генерации результата.

Первый тип событий необходим для отслеживания момента подготовки объектов страницы, инициализации ее структуры и формирования общей инфраструктуры. Подписавшись на такие события можно инициализировать собственные объекты, необходимые для обработки запроса.

После обработки таких событий происходит генерация событий, выполняющихся непосредственно перед генерацией кода HTML. К событиям этой группы относятся такие события как аутентификация и авторизация пользователя, опрос кэша на наличие данной страницы, восстановление состояния и др. Эти события позволяют выполнить собственный код до генерации результата, который будет передан пользователю.

После генерации кода HTML выполняются события, которые позволяют выполнить заключительные действия после обработки запроса. Например, при обработке этих запросов можно сохранить результат в кэше, сохранить состояние страницы или освободить память от ранее созданных объектов.

В целом процесс генерации страницы можно представить следующим образом.


Давайте более подробно рассмотрим этапы обработки страницы:

Инициализация структуры страницы. На этом этапе ASP.NET создает страницу, генерируются все элементы управления, размещенные на странице. При обратном вызове (Postback) ASP.NET десериализует (преобразует в объектное представление) информацию из состояния вида (Viewstate) и применяет ее ко всем элементам страницы. На этом этапе запускается событие Page.Init. Однако это событие редко обрабатывают, поскольку объекты элементов управления еще не созданы и информация из Viewstate еще не загружена.
Инициализация кода пользователя. На этом этапе запускается событие Page.Load и запускается код самой страницы. Многие используют событие Page.Load для инициализации своих элементов управления. Важно, что Page.Load запускается всякий раз при загрузке страницы, даже при обратном вызове (Postback).
Проверка достоверности. На этом этапе у страницы вызывается метод Validate(), который перебирает все элементы управления валидатора и вызывает у него метод Validate(). На основе информации от валидаторов задается свойство страницы Page.IsValid.
Обработка пользовательских событий. На этом этапе элементы управления страницы созданы, а страница прошла проверку на достоверность. Теперь ASP.NET запустит все события элементов управления, происходившие с момента последней обратной отсылки (Postback), например, обработчики кнопок и других элементов управления.
Генерация страницы. На этом этапе ASP.NET запускает события генерации HTML-кода страницы. Генерация элементов управления происходит рекурсивно в рамках страницы.
Очистка. На данном этапе страница находится в конце своего жизненного цикла. В этот момент уже сгенерирован HTML код и повлиять на него уже невозможно. Однако объекты элементов управления до сих пор существуют. В этот момент начинается реальная очистка этих объектов и запускается событие Page.Unload.

В целом основную цепочку событий, которые генерируются средой исполнения ASP.NET можно представить следующим образом.

На каждое такое событие можно подписаться из своего кода и запускать в этот момент собственный код. Семантика каждого события заключается в следующем:

Application_BeginRequest срабатывает в начале каждого запроса, включая запросы на файлы, которые не являются Web-формами;
Application_AuthenticateRequest срабатывает до того, как будет выполнена аутентификация. Это стартовая точка для создания вашей собственной логики аутентификации;
Application_AuthorizeRequest срабатывает после того как пользователь пройдет процедуру аутентификации и ему нужно будет определить его права. Вы можете использовать данное событие для назначения специальных привилегий;
Application_ResolveRequestCache это событие обычно используется вместе с кэшированием выходных данных. В случае если есть кэшированные выходные данные для страницы, это – последний обработчик, который выполнится в модели событий;
Application_AcquireRequestState это событие вызывается перед тем, как для клиента будет получена информация, специфичная для сеанса и использована для заполнения коллекции Session;
Application_PreRequestHandlerExecute это событие вызывается перед тем, как соответствующий HTTP обработчик выполнит запрос;
Application_PostRequestHandlerExecute это событие вызывается сразу после того, как будет обработан запрос;
Application_ReleaseRequestState это событие вызывается тогда, когда информация, специфичная для сеанса, сериализуется из коллекции Session, чтобы стать доступной для следующего запроса;
Application_UpdateRequestCache это событие вызывается перед добавлением информации в кэш выходных данных;
Application_EndRequest это событие вызывается в конце запроса перед тем, как объекты будут освобождены и восстановлены. Этот момент очень подходит для кода очистки.

Кроме этих событий, существует еще ряд глобальных событий, которые генерируются не при каждом обращении к странице, а при определенных условиях:

Application_Start вызывается тогда, когда впервые запускается приложение и создается домен приложения;
Session_Start вызывается каждый раз, когда начинается новый сеанс (инициируется сессия);
Application_Error вызывается всякий раз, когда в приложении возникает необработанное исключение (ошибка);
Session_End вызывается всякий раз при завершении сеанса (сессия удаляется из памяти);
Application_End вызывается сразу после завершения работы приложения. В этот момент можно выполнить критическую очистку памяти и освободить критические ресурсы;
Application_Disposed вызывается после завершения работы приложения, когда сборщик мусора .NET готов к восстановлению занимаемой приложением памяти. В этот момент уже поздно выполнять критическую очистку памяти, хотя вы можете последний раз узнать, были ли освобождены критические ресурсы.

Таким образом, среда исполнения ASP.NET содержит необходимый набор событий для определения собственного поведения приложения в различные моменты времени.

Для того чтобы подписаться на любое из приведенных выше событий, можно воспользоваться двумя способами:

  • создать собственный HTTP-модуль, который будет встроен в среду исполнения HTTP;
  • использовать файл приложения global.asax.

Процесс создания собственного HTTP-модуля подробно рассмотрен далее, поэтому здесь мы не будем на нем останавливаться.

Для подписки на события из файла приложения global.asax, необходимо создать этот файл и определить в классе приложения методы, имена которых совпадают с именем события. Для того, чтобы создать файл приложения, необходимо выбрать пункт "Add new item" в контекстном меню веб-приложения.


После этого в появившемся окне необходимо выбрать соответствующий тип файла.

Созданный класс приложения должен содержать методы, имена которых соответствуют именам приведенных выше событий.


Для того, чтобы отследить обрабатываемые на странице события можно использовать встроенные в ASP.NET средства отладки, например, объект Debug. Для этого необходимо открыть разметку страницы и в директиве Page определить задать свойство Trace равное True.


После этого при обращении к странице будет отображаться отладочная информация. Среди прочей полезной информации будет содержаться информация о генерируемых событиях.


Для того чтобы отследить пользовательские события, давайте добавим на страницу поле ввода (TextBox) и кнопку (Button). После этого запустим проект, введем значение в поле ввода на странице и нажмем кнопку. При этом можно увидеть, что в процессе обработки появились новые события.


Таким образом, ASP.NET предоставляет полноценную инфраструктуру для отслеживания критических точек при обработке запроса. Все что необходимо сделать, чтобы вмешаться в обработку запроса – подписаться на событие и выполнить собственный код.

Краткие итоги

Поскольку процесс обработки запроса к веб-серверу достаточно сложный, он имеет ряд строго определенных моментов времени, в которые выполняется та или иная обработка. Для того, чтобы вмешаться в стандартный процесс обработки существует модель событий ASP.NET. В своем приложении можно подписаться на любое событие ASP.NET и обрабатывать его в соответствии с логикой приложения.

Контрольные вопросы

  • Для чего используется модель ASP.NET Web Forms?
  • Как разрабатываются приложения на базе ASP.NET Web Forms?
  • Что такое модель обратного вызова (Postback)?
  • Как работает модель обратного вызова (Postback)?
  • Что представляют собой элементы управления ASP.NET Web Forms?
  • Какие типы элементов управления присутствуют в Asp.NET Web Forms?
  • Каким образом происходит генерация кода HTML страницы и отдельного элемента управления?
  • Какие способы создания элементов управления ASP.NET Web Forms существуют и чем принципиально отличаются?
  • Для чего нужна модель событий ASP.NET Web Forms?
  • Каким образом можно подписаться на глобальные события ASP.NET Web Forms?
  • Каким образом можно узнать набор и последовательность выполняемых событий при обработке запроса?
Марина Воробьева
Марина Воробьева
Виктория Ткаченко
Виктория Ткаченко

Проигрыватель не работает. После нажатия кнопки Play ничего не происходит.

Андрей Коробейников
Андрей Коробейников
Россия, Новосибирск, Сибирский государственный университет телекоммуникаций и информатики, 1999
Вадим Трунов
Вадим Трунов
Россия