Инициализация структуры страницы.

На этом этапе ASP.NET создает страницу, генерируются все элементы управления, размещенные на странице. При обратном вызове Postback ASP.NET десериализует (преобразует в объектное представление) информацию из состояния вида Viewstate и применяет ее ко всем элементам страницы. На этом этапе запускается событие Page.Init. Однако это событие редко обрабатывают, поскольку объекты элементов управления еще не созданы и информация из Viewstate еще не загружена.

 

 

 

Рисунок 4.9 – Жизненный цикл страницы

 

Инициализация кода пользователя.

На этом этапе запускается событие Page.Load и запускается код самой страницы. Многие используют событие Page.Load для инициализации своих элементов управления. Важно, что Page.Load запускается всякий раз при загрузке страницы, даже при обратном вызове Postback.

 

Проверка достоверности.

На этом этапе у страницы вызывается метод Validate(), который перебирает все элементы управления валидатора и вызывает у него метод Validate(). На основе информации от валидаторов задается свойство страницы Page.IsValid.

Обработка пользовательских событий.

На этом этапе элементы управления страницы созданы, а страница прошла проверку на достоверность. Теперь ASP.NET запустит все события элементов управления, происходившие с момента последней обратной отсылки Postback, например, обработчики кнопок и других элементов управления.

 

Генерация страницы.

На этом этапе ASP.NET запускает события генерации HTML-кода страницы. Генерация элементов управления происходит рекурсивно в рамках страницы.

 

Очистка.

На данном этапе страница находится в конце своего жизненного цикла. В этот момент уже сгенерирован HTML код и повлиять на него уже невозможно. Однако объекты элементов управления до сих пор существуют. В этот момент начинается реальная очистка этих объектов и запускается событие Page.Unload.

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

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

 

Таблица 4.4 – События страницы

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

 

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

 

Таблица 4.5 – Глобальные события

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

 

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

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

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

- использовать файл приложения global.asax.

 

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

 

 

Рисунок 4.10 – Подписка на события из файла приложения global.asax

 

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

 

Рисунок 4.11 – Подписка на события из файла приложения global.asax

 

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

 

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

 

 

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

 

Рисунок 4.12 – Информация о генерируемых событиях при запуске страницы

 

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

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