Tag Archive for 'ASP.NET Page Life Cycle'

Ciclo di vita di una pagina ASP.NET

Lavorando ogni giorno con applicazioni web, ho pensato di fornire qualche dettaglio in più su come funziona una pagina asp.net, argomento molto interessante per chi come me sviluppa software in cui l’engine è totalmente asincrona per sfruttare al meglio il framework e rendere le applicazioni web più reattive quando il bacino di utenza è elevato (o non si sa mai, anche quando il server web che ospita non è dei migliori!).

Partiamo da una lista dei principali steps di cui si compone la generazione di una pagina web asp.net:

  1. Inizializzazione
  2. Costruzione dei controlli
  3. Gestione dello stato
  4. Gestione degli eventi (event handler)
  5. Disegno della pagina (rendering)
Dove tutto ha inizio.
Ma da dove parte tutto? Semplice! Da una richiesta Page Request, il framework, in base alle impostazioni decide se inizializzare nuovamente la pagina o prenderne una copia dalla cache (vi consiglio di leggere qualcosa a riguardo: caching, outputCache); proprietà della pagina come Request e Response vengono impostate, la Request viene inizializzata in base al tipo di richiesta, cioè se la pagina viene caricata per la prima volta o se è in PostBack (tra le proprietà della pagina ce n’è proprio una che si chiama IsPostBack, ovviamente sarebbe opportuno leggere qualcosa anche su questa variabile che differisce come significato dall’argomento outputCahce) ed infine vengono caricate le proprietà relative alla Cultura (ICulture).
Il caricamento
Subito dopo vengono inizializzati tutti i controlli presenti nella pagina, per riassumere: tutti gli elementi html con attributo runat=”server” ed identificati da un ID univoco.
Poi si passa al Caricamento, Load, se la pagina è in PostBack i dati dei controlli vengono caricati dal ViewState (solamente se nella direttiva Page, EnableViewState è impostato a true), in caso contrario viene eseguita la logica descritta dallo sviluppatore.
La validazione
Validation, viene richiamato il metodo di Validazione di ogni controllo per capire se questo ha subito variazioni problematiche. Se la pagina è in PostBack, vengono eseguiti i metodi chiamanti (es. pressione di un bottone a cui è collegato un evento).
Il disegno
Finalmente arriviamo al Disegno vero è proprio, Rendering, attraverso il quale la pagina viene disegnata, un OutputStream carica al suo interno il contenuto HTML generato da ogni controllo presente in essa(si perchè ognuno di essi contiene un metodo che si chiama RenderControl che accetta un HttpTextWriter su cui rilascia codice html per quanto riguarda “se stesso”) e poi di volta in volta per tutti gli altri elementi presenti.
Il rilascio
Alla fine, viene avviata un operazione di “pulizia” (si perchè il framework vuole ordine), cosi si passa al processo di Unload. Una volta che la pagina è stata disegnata ed inviata al richiedente tutte le sue proprietà vengono rilasciate (si parla proprio di Dispose).

Molto importante in questo contesto è il concetto di Event wire-up, ASP.NET cerca di trovare dei metodi che corrispondono ad una denominazione convenzionale (Page_Load, Pag_Init etc.), è possibile attivare o meno questo comportamento (che per Default è lo è già) impostando la proprietà (nella System.Page) AutoEventWireup su true/false.
Con questo breve articolo ho cercato di fornire qualche spiegazione in più, utile durante quei lunghi debug dove delle volte ci riesce davvero difficile capire dove risieda il problema ma più in generale anche per avere più chiarezza sulle strumentazioni che si utilizzano!