l'errore è evidente...
ad ogni nuova sessione tu NON MODIFICHI
Application("utenti")
ad ogni scadenza di sessione tu MODIFICHI
Application("utenti")
ma il SESSION("ID") lo modifichi SOLO quando effettua il login
la soluzione è in un piccolo IF... piccino piccino
codice:
...
Sub Session_OnEnd()
Application.lock
Application("users") = Application("users") - 1
if (Session("Id") & "") <> "" then
Application("utenti") = Replace( Application("utenti") , Session("Id") & "|" ,"")
end if
Application.unlock
End Sub
...
se non ti è chiaro il motivo te lo spiego subito
se questo SESSION("ID") viene impostato, ciò significa che rimane VUOTO per tutti quegli utenti che NON effettuano il login (guest, motori di ricerca.. etc etc)
ma anche la loro sessione scade
e quando scade tu effettui una cosa come questa
REPLACE(Application("utenti"),"" & "|","")
che significa in pratica... eliminare TUTTI i "|"
ciò non è bello
se quindi controlli che SESSION("ID") sia valorizzato, allora elimini il problema degli utenti senza ID impostato
---
il motivo per cui se abbassi il timeout il problema non si pone, è solo perchè tu aumenti il tempo in cui le variabili vengono aggiornate... e quindi è più difficile notarlo
---
rimane il fatto che per controllare se sono online utenti profilati (con profilo utente, quindi un record nel DB), conviene salvare nel DB la data dell'ultima azione e poi usarla come TEMPO DAL QUALE NON FA NESSUNA AZIONE E CHE SE E' MINORE DI X MINUTI VIENE CONSIDERATO COME UTENTE = OFFLINE
ma questa è un'altra storia 
ciao