пятница, 22 апреля 2011 г.

На работу и на волю :)


Список событий в GLOBAL.ASAX

Теория и практика MVC »

Список событий в GLOBAL.ASAX

пятница, 22 апреля 2011, 07:25 | Комментарии: 1 В этой небольшой памятке перечислены события, который можно перехватить используя методы, определяемые в файле global.asax.

Список событий в порядке из вызова

Чтобы не было путаницы в дальнейшем, определим чем аутентификация отличается от авторизации:
  • Аутентификация – идентификация личности пользователя (например по его имени и пароль).
  • Авторизация – определение прав на запрашиваемый пользователем ресурс (страницу, сервис).
Теперь рассмотрим вариант списка событий без их описания. При этом расположим их в порядке, соответствующем последовательности вызова.
01// запуск веб-приложения
02 
03protected void Application_Start(Object sender, EventArgs e);
04 
05// получение запроса
06 
07protected void Application_BeginRequest(Object sender, EventArgs e);
08protected void Application_AuthenticateRequest(Object sender, EventArgs e);
09protected void Application_AuthorizeRequest(Object sender, EventArgs e);
10protected void Application_ResolveRequestCache(Object sender, EventArgs e);
11 
12// начало сессии, один раз для каждого клиента
13 
14protected void Session_Start(Object sender, EventArgs e);
15 
16// обработка запроса
17 
18protected void Application_AcquireRequestState(Object sender, EventArgs e);
19protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e);
20protected void Application_PostRequestHandlerExecute(Object sender, EventArgs e);
21protected void Application_ReleaseRequestState(Object sender, EventArgs e);
22protected void Application_UpdateRequestCache(Object sender, EventArgs e);
23protected void Application_EndRequest(Object sender, EventArgs e);
24 
25// конец запроса
26 
27// отправка ответа
28 
29protected void Application_PreSendRequestHeaders(Object sender, EventArgs e);
30protected void Application_PreSendRequestContent(Object sender, EventArgs e);
31 
32// конец сессии, один раз для каждого клиента
33 
34protected void Session_End(Object sender, EventArgs e);
35 
36// завершение работы веб-приложения
37 
38protected void Application_Disposed(Object sender, EventArgs e);
39protected 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);
В данный метод передаются все необработанные исключения, возникшие в веб-приложении. Как правило используется для записи информации о них в журнал и уведомлений обслуживающего персонала.

Пример файла Global.asax со всеми перечисленными обработчиками

Приведенный ниже код может быть добавлен в ASP.NET или ASP.NET MVC приложение. В каждом приведенном методе используется вызов Debug.Write() из пространства имен System.Diagnostics для вывода уведомления в окно Output. Таком образом можно самостоятельно посмотреть на порядок вызова обработчиков событий (код взять из ASP.NET MVC приложения).
001namespace MvcApplication
002{
003    using System;
004    using System.Diagnostics;
005    using System.Web.Mvc;
006    using System.Web.Routing;
007 
008    // Note: For instructions on enabling IIS6 or IIS7 classic mode,
009    // visit http://go.microsoft.com/?LinkId=9394801
010 
011    public class MvcApplication : System.Web.HttpApplication
012    {
013        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
014        {
015            filters.Add(new HandleErrorAttribute());
016        }
017 
018        public static void RegisterRoutes(RouteCollection routes)
019        {
020            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
021 
022            routes.MapRoute(
023                "User", // Route name
024                "{controller}/{action}/{id}", // URL with parameters
025                new {
026                    controller = "UserProfiles",
027                    action = "Index",
028                    id = UrlParameter.Optional
029                } // Parameter defaults
030            );
031        }
032 
033        protected void Application_Init(Object sender, EventArgs e)
034        {
035            Debug.WriteLine("protected void Application_Init();");
036        }
037 
038        protected void Application_Start()
039        {
040            AreaRegistration.RegisterAllAreas();
041 
042            RegisterGlobalFilters(GlobalFilters.Filters);
043            RegisterRoutes(RouteTable.Routes);
044 
045            Debug.WriteLine("protected void Application_Start();");
046        }
047 
048        protected void Application_End(Object sender, EventArgs e)
049        {
050            Debug.WriteLine("protected void Application_End();");
051        }
052 
053        protected void Application_Disposed(Object sender, EventArgs e)
054        {
055            Debug.WriteLine("protected void Application_Disposed();");
056        }
057 
058        protected void Application_BeginRequest(Object sender, EventArgs e)
059        {
060            Debug.WriteLine("protected void Application_BeginRequest();");
061        }
062 
063        protected void Application_EndRequest(Object sender, EventArgs e)
064        {
065            Debug.WriteLine("protected void Application_EndRequest();");
066        }
067 
068        protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
069        {
070            Debug.WriteLine("protected void Application_PreRequestHandlerExecute();");
071        }
072 
073        protected void Application_PostRequestHandlerExecute(Object sender, EventArgs e)
074        {
075            Debug.WriteLine("protected void Application_PostRequestHandlerExecute();");
076        }
077 
078        protected void Application_PreSendRequestHeaders(Object sender, EventArgs e)
079        {
080            Debug.WriteLine("protected void Application_PreSendRequestHeaders();");
081        }
082 
083        protected void Application_PreSendRequestContent(Object sender, EventArgs e)
084        {
085            Debug.WriteLine("protected void Application_PreSendRequestContent();");
086        }
087 
088        protected void Application_AcquireRequestState(Object sender, EventArgs e)
089        {
090            Debug.WriteLine("protected void Application_AcquireRequestState();");
091        }
092 
093        protected void Application_ReleaseRequestState(Object sender, EventArgs e)
094        {
095            Debug.WriteLine("protected void Application_ReleaseRequestState();");
096        }
097 
098        protected void Application_ResolveRequestCache(Object sender, EventArgs e)
099        {
100            Debug.WriteLine("protected void Application_ResolveRequestCache();");
101        }
102 
103        protected void Application_UpdateRequestCache(Object sender, EventArgs e)
104        {
105            Debug.WriteLine("protected void Application_UpdateRequestCache();");
106        }
107 
108        protected void Application_AuthenticateRequest(Object sender, EventArgs e)
109        {
110            Debug.WriteLine("protected void Application_AuthenticateRequest();");
111        }
112 
113        protected void Application_AuthorizeRequest(Object sender, EventArgs e)
114        {
115            Debug.WriteLine("protected void Application_AuthorizeRequest();");
116        }
117 
118        protected void Session_Start(Object sender, EventArgs e)
119        {
120            Debug.WriteLine("protected void Session_Start();");
121        }
122 
123        protected void Session_End(Object sender, EventArgs e)
124        {
125            Debug.WriteLine("protected void Session_End();");
126        }
127    
128}

среда, 20 апреля 2011 г.

Моё резюме

Выложил свое публичное резюме
http://ural.hh.ru/resume/0b35b7beff00d0a0f80039ed1f344577335333