|
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. |