asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 17543
ASPCode.it - Store
<< lezione precedente lezione successiva >>

ASP: la guida introduttiva - Capitolo 16 - Il file Global.asa

   16.0   Global.asa
   16.1   Avvio e termine di una sessione
   16.2   Avvio e termine di un'applicazione
   16.3   Conteggio degli utenti connessi

   16.4   Aggiornare Global.asa

16.0 - Global.asa

Il file Global.asa, nell'ambito di ASP, è un documento opzionale, che può essere utilizzato per determinati scopi nello sviluppo di un'applicazione Web. Si tratta comunque di un documento non convenzionale: il suo contenuto non verrà mai mostrato all'utente, ne il suo scopo sarà produrre un certo output. Al suo interno, semplicemente, possono essere dichiarati degli oggetti o dei gestori di evento che abbiano a che fare con l'ambito globale delle sessioni e delle applicazioni. Global.asa, per divenire attivo, deve essere posto nella root dell'applicazione che si sta realizzando, e ad ogni applicazione può corrispondere un solo file di questo tipo. Nel corso delle prossime righe saranno analizzati gli scopi e la giusta maniera di utilizzo di questa risorsa.

16.1 - Avvio e termine di una sessione

All'interno di un file Global.asa possono essere associate delle azioni ai due eventi di inizio e fine di una sessione utente. E' possibile fare ciò definendo le due funzioni Session_OnStart e Session_OnEnd. Si osservi l'esemplificativo codice seguente:

<script language="JScript" runat="Server">

function Session_OnStart() {
  // Inizio di una nuova sessione
}

function Session_OnEnd() {
  // Fine di una sessione
}

</script>

Come l'esempio lascia ad intendere, il codice contenuto all'interno di un file Global.asa deve essere racchiuso all'interno dei tag <script>...</script>. Non può essere utilizzata la direttiva <%@ LANGUAGE = JScript %> per dichiarare l'uso di JScript come linguaggio di scripting, in quanto i tag <% e %> in questo caso non hanno valore. In alternativa, però, è possibile specificare l'intenzione di scrivere codice JScript sfruttando l'attributo language del tag <script>.
Sono state definite due funzioni: Session_OnStart e Session_OnEnd. Il codice compreso all'interno della prima verrà eseguito ogni volta che una nuova sessione verrà istanziata dal server, in pratica ogni volta che un nuovo utente si collegherà ad una delle pagine del sito nella cui root sia conservato il file Global.asa corrispondente. Viceversa, la funzione Session_OnEnd verrà eseguita al termine di ciascuna sessione, ovvero quando verrà esplicitamente lanciato il metodo Session.Abandon, oppure quando la durata di una sessione scadrà a causa del Timeout impostato (cfr. Capitolo 13).

16.2 - Avvio e termine di un'applicazione

Simili alle funzioni appena viste risultano Application_OnStart e Application_OnEnd:

<script language="JScript" runat="Server">

function Application_OnStart() {
  // Inizio di una nuova applicazione
}

function Application_OnEnd() {
  // Fine di un'applicazione
}

</script>

In questo caso, però, ad essere gestita è l'intera applicazione, unica e condivisa tra tutti gli utenti collegati. Questo significa che la funzione Application_OnStart verrà eseguita solo all'avvio dell'intera applicazione. Nella filosofia di ASP e dei Web server che supportano questa tecnologia, le applicazioni sono insiemi di script suddivise in cartelle differenti. Si supponga di aver realizzato, ad esempio, un Forum di discussione, contenuto nella cartella \forum del proprio Web server. Ponendo un file Global.asa all'interno di questa cartella, e associando del codice all'evento Application_OnStart, sarà possibile compiere una determinata azione quando l'applicazione prenderà il via. La funzione Application_OnStart, infatti, verrà eseguita la prima volta che un utente qualsiasi richiamerà una delle pagine contenute all'interno della cartella \forum. Application_OnEnd, invece, verrà eseguita immediatamente prima della chiusura dell'applicazione, che corrisponde spesso anche alla chiusura del Web server. Questa funzione, quindi, risulta il veicolo migliore per fare in modo che ogni risorsa usata in ambito globale venga rilasciata (una connessione ad un database perennemente aperta, tanto per citare un esempio, dovrebbe venire qui chiusa).

16.3 - Conteggio degli utenti connessi

Un esempio concreto è quanto di più utile possa esserci in questo momento. Verranno ora messe a frutto le conoscenze relative al file Global.asa appena analizzate, e quelle acquisite nel capitolo precedente rispetto l'utilizzo dell'oggetto built-in Application.
Si supponga di voler conteggiare quanti utenti siano connessi ad un sito Web in un determinato istante, in modo da visualizzare poi il risultato di tale elaborazione sulla Home Page, o anche all'interno di altre pagine. Tutto questo, in parole spicciole, significa conteggiare quante sessioni (si ricordi sempre che ad ogni utente viene associata una ed una sola sessione) siano contemporaneamente attive in ogni singolo istante. Si dovrà allora conservare un dato in maniera globale, in modo da poterlo poi condividere universalmente tra tutti gli utenti connessi. A permettere ciò, come deducibile, è una variabile Application. Il trucco risulta allora semplice, e può essere illustrato in tre brevi passi:
1. All'avvio dell'applicazione (Application_OnStart) verrà definita una variabile intera Application("q_utenti"), il cui valore iniziale sarà zero.
2. Ogni volta che una nuova sessione risulti al nastro di partenza (Session_OnStart), il valore contenuto in Application("q_utenti") verrà incrementato di una unità.
3. Ogni volta che una sessione precedentemente creata sia giunta al termine del proprio ciclo vitale (Session_OnEnd), il valore contenuto in Application("q_utenti") verrà decrementato di una unità.
Tradotto in codice JScript, il ragionamento appena illustrato si trasforma nel seguente enunciato Global.asa:

<script language="JScript" runat="Server">

function Application_OnStart() {
  Application("q_utenti") = 0;
}

function Session_OnStart() {
  Application("q_utenti") = Application("q_utenti") + 1;
}

function Session_OnEnd() {
  Application("q_utenti") = Application("q_utenti") - 1;
}

</script>

Fatto ciò, per visualizzare il numero degli utenti connessi, è sufficiente aggiungere da qualche parte nella Home Page del sito la seguente riga:

In questo momento ci sono <%=Application("q_utenti")%> utenti connessi

Naturalmente la Home Page deve avere estensione .asp, altrimenti la parte compresa tra i tag <% e %> non sarà processata dal server.

16.4 - Aggiornare Global.asa

Un file Global.asa può essere aggiunto o modificato anche mentre il Web server è attivo. In questo caso, però, una particolare politica viene adottata. Una volta salvati i cambi al file in questione, il server continuerà a soddisfare tutte le richieste HTTP in corso, rifiutando con un messaggio di errore tutte le altre che gli verranno contemporaneamente presentate. Conclusa la propria attività con le richieste in corso, l'applicazione gestita dal file Global.asa verrà resettata (e verrà pertanto eseguito il codice di Application_OnEnd incluso nel vecchio Global.asa, se presente) e tutte le sessioni in corso verranno concluse (con l'esecuzione del Session_OnEnd del vecchio Global.asa, come prima). A questo punto l'applicazione verrà riavviata (con il lancio dell'eventuale nuova versione di Application_OnStart), e le richieste HTTP verranno nuovamente accettate, stabilendo così delle nuove sessioni (con il conseguente avvio del nuovo Session_OnStart).
Questo almeno il meccanismo dichiarato nella documentazione ufficiale, anche se durante "prove su strada" i risultati riscontrati con le diverse versioni di IIS e del PWS sono stati differenti. In alcuni casi, infatti, le direttive del Global.asa sono state aggiornate dopo diversi minuti, mentre in altri casi ancora si è reso necessario resettare il Web server per ottenere il risultato desiderato.

<< lezione precedente lezione successiva >>


Utenti connessi: 17543