В этой небольшой памятке перечислены события, который можно перехватить используя методы, определяемые в файле global.asax.
Список событий в порядке из вызова
Чтобы не было путаницы в дальнейшем, определим чем аутентификация отличается от авторизации:
- Аутентификация – идентификация личности пользователя (например по его имени и пароль).
- Авторизация – определение прав на запрашиваемый пользователем ресурс (страницу, сервис).
Теперь рассмотрим вариант списка событий без их описания. При этом расположим их в порядке, соответствующем последовательности вызова.
// запуск веб-приложения
protected void Application_Start(Object sender, EventArgs e);
// получение запроса
protected void Application_BeginRequest(Object sender, EventArgs e);
protected void Application_AuthenticateRequest(Object sender, EventArgs e);
protected void Application_AuthorizeRequest(Object sender, EventArgs e);
protected void Application_ResolveRequestCache(Object sender, EventArgs e);
// начало сессии, один раз для каждого клиента
protected void Session_Start(Object sender, EventArgs e);
// обработка запроса
protected void Application_AcquireRequestState(Object sender, EventArgs e);
protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e);
protected void Application_PostRequestHandlerExecute(Object sender, EventArgs e);
protected void Application_ReleaseRequestState(Object sender, EventArgs e);
protected void Application_UpdateRequestCache(Object sender, EventArgs e);
protected void Application_EndRequest(Object sender, EventArgs e);
// конец запроса
// отправка ответа
protected void Application_PreSendRequestHeaders(Object sender, EventArgs e);
protected void Application_PreSendRequestContent(Object sender, EventArgs e);
// конец сессии, один раз для каждого клиента
protected void Session_End(Object sender, EventArgs e);
// завершение работы веб-приложения
protected void Application_Disposed(Object sender, EventArgs e);
protected void Application_End(Object sender, EventArgs e);
А теперь рассмотрим все эти события более подробно:
- protected void Application_Start(Object sender, EventArgs e);
Вызывается единожды при создании экземпляра класса HttpApplication в момент обращения первого пользователя к нему. Позволяет создать глобальные объекты, доступные во всем приложении.
- protected void Application_BeginRequest(Object sender, EventArgs e);
Вызывается первым каждый раз при получения нового запроса от пользователя.
- protected void Application_AuthenticateRequest(Object sender, EventArgs e);
Вызывается после аутентификации пользователя (установления его виртуальной личности, включая статус "незарегистрированный пользователь"). Данный метод можно использовать для проведения дополнительных проверок его статуса.
- protected void Application_AuthorizeRequest(Object sender, EventArgs e);
Вызывается после авторизации пользователя по отношению к запрашиваемому ресурсу. Т.е. указывает что у пользователя есть права на действие (как правило просмотр), которое он хочет выполнить. Также как и Application_AuthenticateRequest() можно использовать для дополнительных проверок.
- protected void Application_ResolveRequestCache(Object sender, EventArgs e);
Вызывается при поиске в кэше готового результата для запроса. Позволяет модулям вернуть уже готовый ранее результат и не задействовать обработчики. Таким образом снижается нагрузка на сервер, на котором размещено веб-приложение.
- protected void Session_Start(Object sender, EventArgs e);
Вызывается единожды для каждого клиента (посетителя) в начале его сессии.
- protected void Application_AcquireRequestState(Object sender, EventArgs e);
Вызывается после того, как ядро ASP.NET получает текущий контекст (state) запроса (данные сессии).
- protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e);
Вызывается перед обращением к обработчикам запроса (handlers).
- protected void Application_PostRequestHandlerExecute(Object sender, EventArgs e);
Вызывается после завершения работы обработчиков запроса (handlers).
- protected void Application_ReleaseRequestState(Object sender, EventArgs e);
Вызывается после завершения всех обработчиков событий и сохранения контекста (state) запроса.
- protected void Application_UpdateRequestCache(Object sender, EventArgs e);
Вызывается после завершения всех обработчиков событий. В данном методе модули имеют возможность сохранить необходимые данные в кэше. В дальнейшем они могут быть использованы при обработке Application_ResolveRequestCache().
- protected void Application_EndRequest(Object sender, EventArgs e);
Вызывается как последнее событие при завершении обработки запроса от пользователя.
- protected void Application_PreSendRequestHeaders(Object sender, EventArgs e);
Вызывается перед отправкой заголовков ответа клиенту.
- protected void Application_PreSendRequestContent(Object sender, EventArgs e);
Вызывается перед отправкой содержимого ответа (например HTML кода страницы) клиенту.
- protected void Session_End(Object sender, EventArgs e);
Вызывается единожды для каждого клиента (посетителя) при завершении его сессии (закрытии или истечении времени таймаута).
- protected void Application_Disposed(Object sender, EventArgs e);
Вызывается при завершении веб-приложения. Хорошо подходит для методов освобождения используемых ресурсов.
- protected void Application_End(Object sender, EventArgs e);
Вызывается при уничтожении последнего экземпляр класса HttpApplication. Т.е. при истечении таймаута у последнего активного пользователя.
- protected void Application_Error(Object sender, EventArgs e);
В данный метод передаются все необработанные исключения, возникшие в веб-приложении. Как правило используется для записи информации о них в журнал и уведомлений обслуживающего персонала.
- protected void [имя_модуля]_[имя-события](Object sender, EventArgs e);
Позволяет подписаться на событие [имя-события] модуля [имя_модуля]. Например, для обработки события Authenticate класса FormsAuthentication метод должен иметь имя FormsAuthentication_Authenticate.
Пример файла Global.asax со всеми перечисленными обработчиками
Приведенный ниже код может быть добавлен в ASP.NET или ASP.NET MVC приложение. В каждом приведенном методе используется вызов Debug.Write() из пространства имен System.Diagnostics для вывода уведомления в окно Output. Таком образом можно самостоятельно посмотреть на порядок вызова обработчиков событий (код взять из ASP.NET MVC приложения).
namespace MvcApplication
{
using System;
using System.Diagnostics;
using System.Web.Mvc;
using System.Web.Routing;
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"User", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {
controller = "UserProfiles",
action = "Index",
id = UrlParameter.Optional
} // Parameter defaults
);
}
protected void Application_Init(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_Init();");
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
Debug.WriteLine("protected void Application_Start();");
}
protected void Application_End(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_End();");
}
protected void Application_Disposed(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_Disposed();");
}
protected void Application_BeginRequest(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_BeginRequest();");
}
protected void Application_EndRequest(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_EndRequest();");
}
protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_PreRequestHandlerExecute();");
}
protected void Application_PostRequestHandlerExecute(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_PostRequestHandlerExecute();");
}
protected void Application_PreSendRequestHeaders(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_PreSendRequestHeaders();");
}
protected void Application_PreSendRequestContent(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_PreSendRequestContent();");
}
protected void Application_AcquireRequestState(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_AcquireRequestState();");
}
protected void Application_ReleaseRequestState(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_ReleaseRequestState();");
}
protected void Application_ResolveRequestCache(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_ResolveRequestCache();");
}
protected void Application_UpdateRequestCache(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_UpdateRequestCache();");
}
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_AuthenticateRequest();");
}
protected void Application_AuthorizeRequest(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Application_AuthorizeRequest();");
}
protected void Session_Start(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Session_Start();");
}
protected void Session_End(Object sender, EventArgs e)
{
Debug.WriteLine("protected void Session_End();");
}
}
}