#05 Life Cycle aplikacji ASP.NET MVC 5 | Kurs ASP.NET MVC 5

W tym artykule poruszymy to co niewidzialne 🙂 Life Cycle, czyli nic innego jak przetwarzanie żądania HTTP, „klient czegoś żąda” – „serwer odbiera i zastanawia się czego on oczekuje…? Aha.” – „klient otrzymuje odpowiedź”. Troszkę groteskowo, ale teraz przejdźmy do rzeczy, jak się domyślamy każde kliknięcie w link inicjuje żądanie HTTP, które odbierane jest przez serwer. Serwer przetwarza je odpowiednio i zwraca klientowi odpowiedź HTTP, w dzisiejszym wpisie opiszę jak się to odbywa krok po kroku. W trakcie artykuły będę posługiwał się wycinkami z oficjalnego źródła informującego o szczegółach przetwarzania żądań HTTP, mianowicie ASP.NET MVC 5 APPLICATION LIFECYCLE.

ASP.NET MVC 5 APPLICATION LIFECYCLE

ASP.NET MVC 5 APPLICATION LIFECYCLE

ASP.NET MVC 5 APPLICATION LIFECYCLE

HTTP Request

Klikając w link na stronie internetowej, albo najzwyczajniej w świecie wpisując w pole adresowe przeglądarki http://jakasstrona.pl/jakiskontroler/jakasakcja/ewentualne/parametry generejemy żądanie, którego nadawcą jest nasza przeglądarka, a odbiorcą serwer.

Routing

Żądanie HTTP niesie ze sobą pewne informacje. W tym kroku, który de facto jest pierwszym etapem przetwarzania HTTP Request serwer próbuje przyporządkować żądanie do któregoś ze wzorca zapisanego w pliku RouteConfig.cs. Szablony zapisane w tym pliku przechowywane są w System.Web.Routing.RouteTable, a klasa, która dopasowywuje szablon do żądania HTTP to System.Web.Routing.UrlRoutingModule.

Jak widzimy powyżej, domyślnie w pliku .RouteConfig.cs mamy zdefiniowany szablon o nazwie „Default”, który spodziewa się przynajmniej dwóch argumentów. Kolejno są to nazwa kontrolera, nazwa akcji i argument id, który jest opcjonalny. Kontroler, jak i akcja mają przypisane wartości domyślne. Oznacza to, że jeśli wywołamy stronę nie podając żadnych parametrów np. www.jakasstrona.pl, to serwer odbierze to tak jakbyśmy zażądali www.jakasstrona.pl/Home/Index. Warto mieć na uwadze, że wartości przypisywane są tak jak w przypadku zwykłych funkcji od lewej strony, tzn. jeśli wywołamy www.jakasstrona.pl/jakasakcja, to serwer zdefiniuje to tak jakbyśmy wywołali kontroler o nazwie jakasakcja i akcji Index.

MvcHandler

Jak podaje oficjalna dokumentacja w tym kroku wybierany jest kontroler, który obsłuży żądanie HTTPMvcHandler jest odpowiedzialny za pipeline aplikacji. W kodzie poniżej możemy zauważyć, że w ciele metody ProcessRequest wywoływana jest funkcja ProcessRequestInit(). Metoda ProcessRequestInit() inicjuje IControllerFactory factory, następnie fabryka ta zwraca instancję odpowiedniego kontrolera do zmiennej IController controller (Controller Creation), który zajmuje się dalszym przetwarzaniem żądania HTTP.

 

Jak widać na powyższej grafice MvcHandler można rozbić na kilka etapów, po Controller Creation następują Authentication and AuthorizationModel BindingAction Method InvocationResult Execution.

Authentication and Authorization

Authentication, czyli filtr uwierzytelnianiania uruchamiany jest przed Authorization (filtr uprawnień). Jak jego nazwa wskazuje sprawdza czy użytkownik, który wysłał żądanie jest użytkownikiem uwierzytelnionym (przeszedłpozytywnie proces logowania).

Zadaniem filtra Authorization jest sprawdzenie czy użytkownik, który żąda dostępu do źródła ma do niego prawo.

 

Model Binding

Po znalezieniu właściwej akcji kontrolera model binder (System.Web.Mvc.DefaultModelBinder) pobiera, dokonuje konwersji oraz walidacji danych pochodzących z żądania HTTP, dzięki czemu akcja będzie mogła wykorzystać parametry w trakcie wywołania.

Action Method Invocation

Przyszedł czas na wywołanie odpowiedniej akcji kontrolera. Dokonuje się to poprzez wywołanie funkcji InvokeAction() z klasy ActionInvoker.

Result Execution

Akcja kontrolera zwraca zawsze instancję klasy dziedziczącej po ActionResult, może nią być klasa:

  • ViewResult – zwraca widok strony internetowej (Web Page),
  • PartialViewResult – zwraca, tylko kawałek strony, może to być np. sekcja z artykułem, jeśli pozostała część strony nie ulega żadnej zmianie,
  • RedirectResultRedirectToRouteResult  – przekierowanie do innej akcji dowolnego kontrolera,
  • ContentResult – tak opakowywane sa dane zdefiniowane przez użytkownika, klasa posiada trzy właściwości Content (zwracana zawartość), ContentEncoding (kodowanie pola Content) oraz ContentType (informacja dla przeglądarki o rodzaju Content’u może to być text/htmlapplication/json itd.),
  • JsonResult – zwraca dane zapisane w standardzie JSON,
  • JavaScriptResult – zwraca skrypt, który może być wykorzystany przez klienta,
  • FileResult – zwraca uchwyt do pliku do zapisu,
  • EmptyResult – ta klasa jest zwracana, gdy akcja musiałaby zwrócić null,

Dzięki temu, że akcje zachowują spójność w zwracanym typie, zwracając poniekąd instancję jednej klasy ActionResult mogą się wzajemnie wymieniając się efektami swojej pracy.

View Rendering

Typy ViewResult są przetwarzane przez odpowiedni silnik renderujący widok. Tak jak pisałem we wpisie o modelu MVC w aplikacji ASP.NET może to być Razor, ASPX lub inny silnik zdefiniowany przez nas. Ważne jest, aby silnik dziedziczył po interfejsie IView.

Podsumowanie

Pokrótce wiemy co dzieje się za kulisami. Zrozumienie Life Cycle aplikacji ASP.NET nawet w tak ogólnikowym stopniu bardzo upraszcza tworzenie oprogramowania, a myślę, że i przyczyni się do wzrostu jakości pisanego przez nas kodu.

Wpis jest częścią kursu ASP.NET MVC 5.

 

Dodaj komentarz