Newsgroup: it.comp.www.asp
Titolo: Contatore utenti connessi al sito tramite variabili Session

Uso il global.asa per conteggiare gli utenti connessi in questo modo, che
conoscerte sicuramente tutti:
Sub Application_OnStart()
Application.Lock
Application("collegati") = 0
Application.UnLock
End Sub
Sub Session_OnStart
Application.Lock
Application("collegati") = Application("collegati") + 1
Application.UnLock
End Sub
Sub Session_OnEnd
Application.Lock
Application("collegati") = Application("collegati") - 1
Application.UnLock
End Sub
Il problema è che se apro una finestra del browser mi trovo 1 utente
connesso, come giusto. Apro due finestre e trovo 2 utenti. A questo punto
chiudo la prima finestra e ne apro un'altra e mi trovo 3 utenti connessi!!!
Ma come???
Sembra che non mi riconosca l'evento Session_OnEnd.
In poche parole incrementa la variabile correttamente ma non la
DEcrementa!!!
Come mai?
Grazie
Luca

 Come mai?
Sembra piuttosto che non accetti cookies.
Il sessionid e' un cookie.
Saluti.
Luciano

 Saluti.
mmm... ma il mio browser accetta i cookies. Sono sicuro dal momento che ho
testato uno script per leggere e scrivere la data dell'ultimo accesso.
Da cosa può dipendere?

 chiudo la prima finestra e ne apro un'altra e mi trovo 3 utenti
connessi!!!
Credo che il problema sia che non hai aspettato i 20 minuti necessari per
fare andare in timeout la sessione.
Infatti, a meno di un session.abandon, la sessione non viene chiusa alla
chiusura del browser ma bensě dal server allo scadere del timeout, che č
impostato per default a 20 minuti.

 Il sessionid e' un cookie.
Se non accettasse i cookies, non dovrebbe fare nemmeno il Session_OnStart

 Da cosa può dipendere?
Allora, se chiudi e riapri il browser e' normale che lui ti assegni un nuovo
sessionid. Quanto al sessiononend viene eseguito allo scoccare el
sessiontimout a meno di un abbandono forzato previsto da te.
Sicuro che ti da una nuova sessione se apri una seconda finestra senza avere
chuso la prima?
Saluti.
Luciano

 Se non accettasse i cookies, non dovrebbe fare nemmeno il Session_OnStart
Come no!
Ma ogni chiamata al server e' per lui una nuova sessione non potendo capire
da un cookie che in realta' e' un tizio che gia' ne ha aperta una o piu'.
100 chiamate, 100 sessioni.
Saluti.
Luciano

 impostato per default a 20 minuti.
OK, questo fila... nel senso che c'è un riscontro. Dopo un pò (direi più o
meno 20 minuti) gli utenti tornano calano (scendono a uno se lascio il pc
senza usarlo con un'unica finestra sul sito).
Ma allora come posso risolvere??
In questo modo il computo degli utenti sarà sbagliato...

 ha scritto nel messaggio
news:JvI08.27684$cU4.9...@twister1.libero.it...

Dunque, il discorso delle session funziona più o meno così...
Il protocollo HTTP è un protocollo "stateless", ovvero è "senza memoria" ed
è sempre il browser che fa una domanda e il server che risponde; una volta
che il server ha risposto dal suo punto di vista la cosa è morta lì.
Non esistono connessioni che rimangono aperte, tutto finisce quando il
server manda la risposta.
Le sessioni in realtà sono un meccanismo che IIS usa per "simulare" questo.
Ogni volta che il browser chiama una pagina, il server prova a leggere un
certo cookie in cui ha salvato i dati che identificano la sessione;
se i cookie non sono abilitati, le sessioni non sono supportate,
se il cookie non esiste, allora per lui è una nuova sessione, genera un
numerone al quale internamente associa i dati di sessione e scrive il
numerone nel cookie, e esegue il Session_OnStart
se il cookie esiste, legge il numerore e va a ripescare le variabili di
session associate, e te le mette nell'array di session.
Il server NON HA MODO di sapere se il client è ancora attivo, o ha chiuso il
browser;
semplicemente ogni volta che una richiesta di un browser viene identificata
come legata ad una sessione, aggiorna una sua variabile in cui scrive data e
ora dell'ultimo accesso; "ogni tanto" controlla l'elenco delle session e
"butta via" quelle scadute ovvero quelle per cui l'ultimo accesso è più
vecchio di N minuti.
Forse queste cose le conosci, e chiedo scusa a tutti gli esperti per il mio
linguaggio poco formale, ma forse una spiegazione terra-terra può essere
utile a qualcuno.
Venendo al tuo problema, tu vuoi che una conessione rimanga attiva per tutto
il tempo in cui il browser resta aperto sulla tua pagina ?
Credo che l'unico modo sia fare in maniera che il browser faccia un'accesso
ogni N minuti, per "rinfrescare" la connessione.
E' vero che il tempo di timeout di 20 minuti può essere variato, ma non è un
buon sistema.
Puoi fare un piccolo frame o un IFrame, magari non visibile, che si
rinfresca automaticamente ogni N minuti.