Session

mercoledì 23 luglio 2003 - 17.07

sp Profilo | Newbie

Eccoci alla croce e delizia di ogni sviluppatore asp ed asp.net...

Quello che voglio fare e' avere un elenco dei miei utenti registrati on - line...
ora, come fare? io so se un'utente e' registrato leggendolo dai suoi cookies...

Brainkiller Profilo | Guru

Ciao sp,
continua i ... (puntini) tu cosa pensi? Come si potrebbe implementare?
Tu vuoi vedere una lista degli utenti on-line in un particolare momento, giusto?
Diciamo un qualcosa in più rispetto al classico numero di utenti on-line che comunque già in passato non era facile da gestire e quando era gestito forniva dati abbastanza diversi da quello che effettivamente era.
In ASP 3.0 so che si poteva locckare l'applicazione ed incrementare un contatore però poi so che erano nati dei problemi che derivavano dal blocco dell'applicazione. Allo stesso modo si potrebbe usare invece che un contatore una Collection però è difficile capire quando un utente abbandona il sito web, cioè quindi quando scade la sessione....

Hai idee tu?
Ciao

David

sp Profilo | Newbie

Allora, io ti posterei quello che ho fatto e ci si puo' riflettere assieme... Lo sviluppo da me fatto e' prettamente il global.asax:
(io penso che dovresti almeno togliere il wrap da queste textbox, se ci incolli un pochetto di codice non si capisce nulla, cmq proviamo...)

public class Global : System.Web.HttpApplication
{
ArrayList users = new ArrayList();
public Global()
{
InitializeComponent();
}

protected void Application_Start(Object sender, EventArgs e)
{
Application["ConnectedUsers"] = "";
Application["ConnectedUsersCount"] = 0;
Application["ConnectedGuestCount"] = 0;
}

protected void Session_Start(Object sender, EventArgs e)
{
//setta il timeout di default a 5
Session.Timeout = 5;
Application.Lock();
Session["userName"] = "";

Login l = new Login();
// read cookies
if (l.IsUserLogged())
{
string UserName = l.UserName;
Session["userName"] = UserName;
// if user already logged do not count it!
if (Application["ConnectedUsers"].ToString().IndexOf(UserName + "'") < 0)
{
Application["ConnectedUsers"] += UserName + "'";
Application["ConnectedUsersCount"] = (int)Application["ConnectedUsersCount"] + 1;

}
}
else
{
Application["ConnectedGuestCount"] = (int)Application["ConnectedGuestCount"] + 1;
}

Application.UnLock();
}

protected void Application_BeginRequest(Object sender, EventArgs e)
{

}

protected void Application_EndRequest(Object sender, EventArgs e)
{

}

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{

}

protected void Application_Error(Object sender, EventArgs e)
{

}

protected void Session_End(Object sender, EventArgs e)
{
//quando il visitatore esce (-1)
Application.Lock();
string UserName = Session["userName"].ToString();
if (UserName != "")
{
// if user already logged cancel it
if (Application["ConnectedUsers"].ToString().IndexOf(UserName + "'") >= 0)
{
Application["ConnectedUsers"] = Application["ConnectedUsers"].ToString().Replace(UserName + "'","");
Application["ConnectedUsersCount"] = (int)Application["ConnectedUsersCount"] - 1;

}
}
else
{
Application["ConnectedGuestCount"] = (int)Application["ConnectedGuestCount"] - 1;
}

Application.UnLock();

}

protected void Application_End(Object sender, EventArgs e)
{

}

sp Profilo | Newbie

ArrayList users = new ArrayList

/*
non serve ad una mazza, me ne sono accorto dopo che l'ho postato, pezzo di vecchio codice...
*/

poi la classe Login, legge i cookies per vedere sei sei Loggato o no.

difetti di questo mio codice:
1. Dopo 5 minuti che non navighi sparisci e non riappari + a meno che tu non chiuda il browser.
2. Se ti connetti non Loggato ti aggiunge ai guest e quando ti logghi non ti aggiunge ai Loggati xhe' per lui sei un guest e la tua sessione non e' scaduta.
3. Se mi sconnetto e continuo a navigare dovrebbe cancellarmi dagli utenti e segnarmi tra i guest.

i punti 2 e 3 son oda risolvere all'interno della mia classe Login, ma mi da un errore del cavolo:

"Riferimento a un oggetto non impostato su un'istanza di oggetto."

dalla riga:
HttpContext.Current.Session["userName"] = _UserName;
//_UserName non e' null...

Bene, credo sia tutto...
Se hai tempo e voglia di fare un po' di strada con me in questa selva oscura...
Grazie e ciao
Stefano

Brainkiller Profilo | Guru

Come va?
Secondo me però il vero problema è questo.
Tu dici, appena uno si logga puoi aggiungerlo fra gli utenti loggati, appena fa un logoff lo sposti e lo metti nei guest, però poi se lui si disconnette come fai a rimuoverlo dalla lista dei guest?
Questo secondo me è il vero problema, cioè come capisci che la sua sessione è scaduta?

P.S. Hai ragione per il word wrap, grazie di avermelo fatto notare, nella prossima release di Forum ci saranno delle piccole correzioni per cui ci sarà tutto lo spazio dedicato al messaggio senza data e ora a destra e senza nome utente a sinistra che verranno inseriti altrove.

Ciao
David

sp Profilo | Newbie

Cmq se guardi il listato che ho postato, alla session_end del global asax lui capisce che la sessione e'scaduta e lo rimuove dagli ospiti o dagli utenti...
Meglio di cosi' credo si possa fare solo con client side.
Cmq se vuoi vedere sto codice + le modifiche che ho fatto alla classe login in azione collegati a
http://www.mega-pixel.net
che e'il mio primo sito asp.net ed e' stato rilasciato proprio ieri ;-) devo ringraziarti molto per gli aiuti e per la pazienza che hai avuto nell'ascoltarmi...
Ciao e grazie.
Stefano

P.S.
Se vuoi darmi consigli su come potevo fare le cose con questa nuova tecnologia saro' tutto orecchie!

Brainkiller Profilo | Guru

Si scusa, hai ragione non avevo visto.
Boh... io ti posso dire però che nella mia vita... ho sempre desiderato implementare una funzionalità di questo tipo su un sito Web ma alla fine ho sempre lasciato perdere un po' per la poca utilità offerta agli utenti, un po' perchè se su un sito visualizzi (1 utente connesso) nessuno viene a vederti! :)
Altri invece addirittura hanno oltre 1000 utenti connessi contemporaneamente su siti modesti e non roba come Microsoft, ed è per questo che ritengo che questi contatori alla fine sparino dati non troppo corretti.

Ho visto il tuo sito, molto carino e rapido. Vedo che è in ASP.NET quindi hai messo in opera lo studio che hai fatto. Complimenti.

Ciao
David
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5