Чтение онлайн

ЖАНРЫ

ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Троелсен Эндрю

Шрифт:

 // Код, выполняемый при запуске приложения.

}

void Application_End(Object sender, EventArgs e) {

 // Код, выполняемый при завершении приложения.

}

void Applicatioт_Error(Object sender, EventArgs e) {

 // Код, выполняемый при появлении необработанной ошибки.

}

void Session_Start(Object sender, EventArgs e) {

 // Код, выполняемый при открытии нового сеанса.

}

void Session_End(Object sender, EventArgs e) {

 //
Код, выполняемый при завершении сеанса.

}

‹/script›

Однако первое впечатление может оказаться обманчивым. В среде выполнении программный код этого блока ‹script› преобразуется в тип класса, получающийся из System.Web.HttpApplication. Если вы имеете опыт работы с ASP.NET 1.х, то вы, наверное, вспомните, что там файл с внешним кодом поддержки для Global.asax буквально определял класс, получающийся из HttpApplication.

Как уже было сказано, члены, определённые в Global.asax, содержатся в обработчиках событий, позволяющих взаимодействовать с событиями на уровне приложения (а также сеанса). Описания этих членов предлагаются в табл. 24.1.

Таблица 24.1. Обработчики событий Global.asax

Обработчик события Описание
Аррlication_Start Вызывается только при запуске Web-приложения, поэтому генерируется только один раз за все время выполнения Web-приложения. Является идеальным местом для определения данных уровня приложения, доступных в любой точке Web-приложения
Application_End Вызывается при завершении работы приложения, например, вследствие превышения времени ожидания для последнего пользователя или при завершении работы приложения вручную с помощью IIS
Session_Start Вызывается при регистрации нового пользователя в приложении. Здесь можно установить параметры, связанные с конкретным пользователем
Session_End Вызывается при завершении сеанса пользователя (обычно в результате превышения установленного времени ожидания)
Application_Error Глобальный обработчик ошибок, который вызывается тогда, когда Web-приложение генерирует необработанное исключение 

Последний глобальный шанс для обработки исключений

Позвольте указать на роль обработчика событий Application_Error. Напомним, что страница может использовать обработчик события Error для обработки любого исключения, сгенерированного в контексте страницы и оставшегося без обработки. Обработчик Application_Error оказывается последним пунктом возможной обработки исключений, которые не были обработаны на уровне страницы. Как и в случае события Error на уровне страницы, вы можете получить доступ к конкретному объекту System.Exception, используя наследуемое свойство Server.

void Application_Error(Object sender, EventArgs e) {

 Exception ex = Server.GetLastError;

 Response.Write(ex.Message);

 Server.ClearError;

}

Обработчик Application Error является "последним шансом" обработки события для вашего Web-приложения, где вы, вместо предъявления сообщения об ошибке пользователю, можете записать соответствующую информацию в журнал регистрации событий Web-сервера, например:

‹%@ Import Namespace = "System.Diagnostics"%›

void Application_Error(Object sender, EventArgs e) {

 // Запись последнего события в журнал событий.

 Exception ex = Server.GetLastError;

 EventLog ev = new EventLog("Application");

 ev.WriteEntry(ex.Message, EventLogEntryType.Error);

 Server.ClearError;

 Response.Write("Это
приложение "зависло". Извините!");

}

Базовый класс HttpApplication

Как уже говорилось, сценарий Global.asax динамически преобразуется в класс, который получается из базового класса System.Web.HttpApplication и обеспечивает те же функциональные возможности, что и тип System.Web.UI.Page. Описания соответствующих членов предлагаются в табл. 24.2.

Таблица 24.2. Ключевые члены типа System.Web.HttpApplication

Свойство Описание
Application Позволяет взаимодействовать с переменными уровня приложения, используя доступный тип HttpApplicationState
Request Позволяет взаимодействовать с входящим HTTP-запросом (с помощью HttpRequest)
Response Позволяет взаимодействовать с HTTP-ответом (с помощью HttpResponse)
Server Получает внутренний объект сервера для текущего запроса (с помощью HttpServerUtilitу)
Session Позволяет взаимодействовать с переменными уровня сеанса, используя доступный тип HttpSessionState

Различия между приложением и сеансом

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

С другой стороны, данные состояния сеанса используются для сохранения информации, касающейся конкретного пользователя (например, товаров в корзине покупателя). Практически состояние сеанса пользователя представляется типом класса HttpSessionState. При регистрации нового пользователя в Web-прило-жении ASP.NET среда выполнения автоматически назначит этому пользователю новый идентификатор (ID) сеанса, время использования которого по умолчанию истекает после 20 минут неактивности пользователя. Если на вашем узле зарегистрируются 20000 пользователей, вы будете иметь 20000 отдельных объектов HttpSessionState, каждому из которых будет назначен свой уникальный идентификатор сеанса. Схема взаимосвязей между Web-приложением и Web-сеансами показана на рис. 24.3.

Рис. 24.3. Взаимосвязи приложения и его сеансов

Вы, возможно, знаете, что в рамках классической технологии ASP данные состояния приложения и состояния сеанса представляются разными COM-объектами (например, Application и Session). В ASP.NET типы, производные от Page. как и тип HttpApplication, используют свойства с такими же именами (т.е. Application и Session), которые предоставляют доступ к соответствующим типам HttpApplicationState и HttpSessionState.

Поддержка данных состояния приложения

Тип HttpApplicationState предоставляет возможность совместного использования глобальной информации для множества сеансов в приложении ASP.NET. Например, можно иметь одну строку соединения, используемую всеми страницами приложения, один общий тип DataSet, используемый множеством страниц, или любой другой фрагмент данных, доступ к которому требуется обеспечить на уровне всего приложения. Описания основных членов типа HttpApplicationState предлагаются в табл. 24.3.

Поделиться с друзьями: