W aplikacji webowej ASP.NET MVC możemy znaleźć plik Global.asax zawierający klasę MvcApplication dziedziczącą po klasie HttpApplication. Postanowiłem poświęcić temu kolejny wpis, ponieważ myślę że warto opisać do czego on służy, tym bardziej że pytanie to może być także zadane na rozmowach o pracę 😉
Plik Global.asax jest to opcjonalny plik zawierający kod, który odpowiada za reagowanie na zdarzenia zgłoszone z poziomu aplikacji i poziomu sesji takie jak start aplikacji, zakończenie sesji, itp. Plik ten jest opcjonalny, czyli nie musimy reagować na te zdarzenia, jeżeli nie chcemy.
Domyślnie plik ten zawiera następujący kod:
1 2 3 4 5 6 7 8 9 10 11 |
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } } |
Jak widać jest tutaj tylko zaimplementowane obsłużenie zdarzenia startu aplikacji, jednak nic nie stoi na przeszkodzie, aby dodać obsługę innych zdarzeń.
W tym celu wystarczy dodać odpowiednio nazwaną metodę/metody np.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
protected void Application_End() { //... } protected void Session_Start() { //... } protected void Session_End() { //... } protected void Application_BeginRequest() { //... } |
To wszystko, nie musimy robić nic więcej (poza implementacją reakcji na zdarzenie). Gdy zdarzenie zostanie zgłoszone, zostanie ono odpowiednio obsłużone.
Lista zdarzeń wraz z krótkim opisem każdego z nich prezentuje się następująco:
Application_Init: pojawia się podczas inicjalizacji aplikacji albo pierwszego wywołania.
Application_Disposed: pojawia się zaraz przed końcem życia aplikacji. Idealne miejsce do zwolnienia używanych zasobów.
Application_Error: pojawia się podczas wystąpienia błędu, który nie został obsłużony w aplikacji.
Application_Start: pojawia się podczas stworzenia pierwszej instancji klasy HttpApplication. Pozwala na stworzenie obiektów dostępnych we wszystkich instancjach HttpApplication.
Application_End: pojawia się, kiedy ostatnia instancja klasy HttpApplication kończy swój cykl życia. Odpalany tylko raz.
Application_BeginRequest: pojawia się podczas odebrania żądania aplikacji. Jest to pierwsze odpalane zdarzenie.
Application_EndRequest: jest to ostatnie zdarzenie, które pojawia się podczas żądania aplikacji.
Application_PreRequestHandlerExecute: pojawia się przed wykonaniem obsługi zdarzenia strony albo web serwisu.
Application_PostRequestHandlerExecute: pojawia się na koniec wykonania obsługi zdarzenia.
Applcation_PreSendRequestHeaders: pojawia się przed wysłaniem nagłówków HTTP do klienta wysyłającego żądanie (przeglądarka).
Application_PreSendRequestContent: pojawia się przed wysłaniem zawartości do klienta wysyłającego żądanie (przeglądarka).
Application_AcquireRequestState: pojawia się podczas pobrania bieżącego stanu (stanu sesji) związanego z bieżącym żądaniem.
Application_ReleaseRequestState: pojawia się podczas zakończenia wykonania obsługi wszystkich zdarzeń.
Application_ResolveRequestCache: pojawia się, kiedy zakończy się autoryzacja, by pozwolić modułom cachującym obsługiwać żądania z cachu obchodząc wykonania obsługi zdarzenia np. strony lub web serwisu.
Application_UpdateRequestCache: pojawia się po zakończeniu wykonania obsługi zdarzenia, by pozwolić modułom cachującym przechowywać odpowiedzi do obsługi kolejnych żądań.
Application_AuthenticateRequest: pojawia się, gdy moduł zabezpieczeń ustali tożsamość bieżącego użytkownika. Od tego momentu poświadczenia użytkownika są zatwierdzone.
Application_AuthorizeRequest: pojawia się, gdy moduł zabezpieczeń zweryfikuje, że użytkownik może uzyskać dostęp do zasobów.
Application_MapRequestHandler: pojawia się, gdy procedura obsługi jest wybrana do odpowiedzi na żądanie.
Application_PostLogRequest: pojawia się podczas zakończenia przetwarzania obsługi wszystkich zdarzeń dla zdarzenia LogRequest
Session_Start: pojawia się, gdy nowy użytkownik odwiedzi stronę aplikacji.
Session_End: pojawia się, gdy sesja użytkownika przekroczy limit czasu, zakończy się albo strona aplikacji zostanie opuszczona.
Warto o tym wiedzieć, bo być może kiedyś przyda nam się obsługa któregoś ze zdarzeń.