invece di farti la lezioncina sul session_onend ci dici cosa stai cercando di fare, cosa non funziona, ecc....?
Be', forse perché non avevo ancora letto la tua firma...! 
Dunque, sto alle prese con la solita routine per il controllo degli utenti on line. Nella variabile Application si incrementa il solito valore n+1 per ciascun utente che entra. Nell'evento onStart si trasrive una matrice(1-2-3-4) con data e ora, session-id, ip, client in un'altra variabile Application. Quando l'utente si iscrive, la matrice aggiunge un campo matrice(5) contenente l'id-utente.
Allo scadere di una sessione, oltre al decremento del computo, una routine controlla prima se la matrice contiene 4 campi (utente non registrato) o 5 (utente registrato) per aggiornare il computo degli utenti registrati.
Il codice è il seguente:
codice:
Sub Session_OnStart
Session.Timeout = 20
Application.Lock
If Application("IPlist") & "" = "" then
Application("IPlist") = "anonimo#" & Right(Session.SessionID,3) & "|;|" & Request.ServerVariables("REMOTE_HOST") & "|;|" & Date() & "|;|" & Time() & "|;|" & Request.ServerVariables("HTTP_USER_AGENT")
Application("users_online") = Application("users_online") + 1
Else
Application("IPlist") = Application("IPlist") & "|.|" & "anonimo#" & Right(Session.SessionID,3) & "|;|" & Request.ServerVariables("REMOTE_HOST") & "|;|" & Date() & "|;|" & Time() & "|;|" & Request.ServerVariables("HTTP_USER_AGENT")
Application("users_online") = Application("users_online") + 1
End If
Application.Unlock
SetLog "users.log", ">| " & Date() & " " & Time(), "SessionID#" & Session.SessionID & "|;|" & Request.ServerVariables("REMOTE_HOST") & "|;|" & Request.ServerVariables("HTTP_USER_AGENT") & "
"
End Sub
Sub Session_OnEnd
Application.Lock
If Application("users_online") = 1 then
Application("users_online") = 0
Dettagli = Split(Application("IPlist"), "|;|")
iDettagli = UBound(Dettagli)
if iDettagli = 5 Then Application("reg_users_online") = 0
Application("IPlist") = ""
Else
IPlistTmp = ""
InfoUtente = Split(Application("IPlist"), "|.|")
for iInfoUtente = 0 to UBound(InfoUtente)
Dettagli = Split(InfoUtente(iInfoUtente), "|;|")
iDettagli = UBound(Dettagli)
if Dettagli(0) = "anonimo#" & Right(Session.SessionID,3) then
Application("users_online") = Application("users_online") - 1
if iDettagli = 5 and not Dettagli(5) = "webmaster" then
Application("reg_users_online") = Application("reg_users_online") - 1
end if
else
if iInfoUtente = 0 then IPlistTmp = InfoUtente(0)
if iInfoUtente > 0 And IPlistTmp & "" = "" then IPlistTmp = InfoUtente(iInfoUtente)
if iInfoUtente > 0 And Not IPlistTmp & "" = "" then IPlistTmp = IPlistTmp & "|.|" & InfoUtente(iInfoUtente)
end if
next
Application("IPlist") = IPlistTmp
End If
Application.Unlock
SetLog "users.log", "|< " & Date() & " " & Time(), "SessionID#" & Session.SessionID & "
"
End Sub
Risultato: nessun aggiornamento viene compiuto durante l'evento onEnd, e in più la sessione Application resetta (azzera) tutte le proprie variabili.
P.S. Provato pure a "commentare" la riga della funzione SetLog().