Анатомия приложений ASP.NET
Глобальные события приложения
Процесс обработки запроса любого веб-приложения нетривиален. Перед тем, как будет запущен программный код генерации результата, будет пройдено еще несколько этапов. Среди этих этапов – подготовка к обработке запроса, проверка системы безопасности, проверка наличия страницы в кэше, восстановление состояния и др. После генерации результата и перед отправкой результата клиенту также выполняется набор действий – сохранение страницы в кэше (если это необходимо), сохранение состояния сеанса и др. В некоторых ситуациях в разрабатываемых приложениях требуется отследить момент выполнения того или иного действия. Для этого была создана модель глобальных событий ASP.NET.
Модель событий ASP.NET содержит два типа глобальных событий, которые можно обработать: события, которые возникают каждый раз при обработке запроса и события, которые возникают не всегда, а только при определенных условиях.
События, которые возникают при обработке каждого запроса генерируются в следующем порядке:
BeginRequest | генерируется в начале выполнения каждого запроса; |
AuthenticateRequest | генерируется непосредственно перед моментом как будет выполнена аутентификация. Это стартовая точка для создания собственной системы аутентификации; |
AuthorizeRequest | генерируется непосредственно перед моментом авторизации; |
ResolveRequestCache | генерируется в момент проверки локального кэша на наличие текущей страницы в кэше; |
AcquireRequestState | генерируется в момент, когда для клиента будет получена информация, специфичная для сеанса (Session); |
PreRequestHandlerExecute | генерируется непосредственно перед тем, как управление будет передано HTTP-обработчику; |
PostRequestHandlerExecute | генерируется сразу после того, как запрос будет обработан HTTP-обработчиком; |
ReleaseRequestState | генерируется в момент, когда информация, специфичная для сеанса сериализуется из коллекции Session в строку, чтобы стать доступной для следующего запроса; |
UpdateRequestCache | генерируется в момент добавления информации в кэш выходных данных; |
EndRequest | генерируется в конце запроса перед тем, как объекты будут уничтожены. |
Также есть ряд специфичных событий, которые генерируются при определенных условиях:
Start | генерируется в момент, когда впервые запускается приложение и создается домен приложения; |
SessionStart | генерируется всякий раз, когда начинается новый сеанс; |
SessionEnd | генерируется при завершении сеанса; |
Error | генерируется всякий раз, когда в приложении возникает необработанное событие; |
End | генерируется в момент завершения работы приложения; |
Disposed | генерируется после завершения работы приложения, когда сборщик мусора .NET готов к восстановлению занимаемой памяти. |
Для использования модели событий ASP.NET необходимо переопределить класс приложения HttpApplication. Для этого нужно добавить в проект файл приложения global.asax.
Для того чтобы подписаться на глобальные события, необходимо в файл приложения добавить методы, имена которых соответствуют именам событий, причем к имени события необходимо добавить название "Application_". Например, чтобы подписаться на событие Start, необходимо создать метод "Application_Start". Аналогичным образом можно создать обработчики и для других событий. Пример файла приложения с созданными обработчиками глобальных событий приведен ниже.
Аналогичным образом на глобальные события можно подписаться из другого места, например, HTTP-модуля ASP.NET (этот механизм будет рассмотрен далее). Для этого следует воспользоваться классом HttpApplication.
Глобальные события нужны далеко не в каждом приложении ASP.NET. Если приложение выполняет простые операции, использующие готовые алгоритмы, то глобальные события могут не понадобиться. Однако, в более сложных ситуациях использование глобальных событий ASP.NET является очень удобным. Например, при разработке собственной системы безопасности разработчику не требуется думать о том, в какой момент лучше проверять права доступа у данного пользователя – он может успешно подписаться на соответствующее событие, а среда исполнения ASP.NET вовремя сгенерирует нужное событие. Аналогично, если требуется улучшить систему кэширования, то можно подписаться на нужные события и встраивать свою логику кэширования в существующую инфраструктуру.
Таким образом, глобальные события ASP.NET позволяют встроить дополнительную логику в существующую инфраструктуру, обеспечивая тем самым гибкими возможностями по расширению.
Краткие итоги
При обработке HTTP-запроса веб-приложение выполняет ряд действий, скрытых от разработчика приложений. Для того чтобы вмешаться в обработку этого процесса ASP.NET имеет модель событий. Разработчик может подписаться на любое событие модели событий ASP.NET. Это можно сделать, используя глобальный файл приложения global.asax или использовать класс HttpApplication.