[ASP.NET] Sistema realtime di rilevamento degli utenti connessi
Conoscere il numero preciso di utenti connessi in un’applicazione ASP.NET non è possibile, sfruttando ad esempio le Membership API è possibile ottenere il numero di utenti connessi usando come criterio discriminante il timeout della Session (Membership.GetNumberOfUsersOnline()). In questo modo però è possibile monitorare solamente gli utenti loggati e comunque il numero rimane piuttosto approssimato.

Personalmente non ho mai avuto la necessità di tenere una traccia più accurata a scopo statistico, ma vediamo comunque come risolvere il problema :-).

Ah, il famigerato evento Session.End *non* è deterministico, quindi non lo si può sfruttare per questo obiettivo.

La soluzione è piuttosto semplice:
- un WebService che i client chiamano ciclicamente
- un timer Javascript che richiama il WebService 
Web server structure


1) L’attributo ScriptService permette di chiamare il web service tramite AJAX.
[WebService(Namespace = "http://eyeopen.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
[ScriptService]
public class AliveService : WebService
{
    [WebMethod]
    public void SendAlive()
    {
        ////string sessionId = HttpContext.Current.Request.Params["ASP.NET_SessionId"];
        string sessionId = HttpContext.Current.Request.UserHostAddress;
        UsersManager.RegisterUser(sessionId);
   }
}

2) Il file Javascript necessario a chiamare il web service:

function SendAlive() {
    EyeOpen.UsersMonitor.Web.AliveService.SendAlive();
}

function AliveTimerTick() {
    SendAlive();
    setTimeout(AliveTimerTick, 1000);
}

if (typeof (Sys) !== "undefined") {
    Sys.Application.notifyScriptLoaded();
}

setTimeout(AliveTimerTick, 1000);

 


3) Infine la reference al file Javascript tramite lo ScriptManager
e la reference al web service:

<asp:ScriptManager ID="scriptManager" runat="server">
    <Scripts>
        <asp:ScriptReference Path="~/Js/Alive.js" />
    </Scripts>
    <Services>
        <asp:ServiceReference Path="~/Core/AliveService.asmx" />
    </Services>
</asp:ScriptManager

 


La rappresentazione della classe di supporto al web service: 
Classe di supporto al web service

In sostanza il web service lato server viene chiamato da un timer javascript ogni secondo, con un basso carico di rete e sul server, segnalando la presenza dell’utente, nel momento in cui vengono chiuse tutte le pagine che richiamano il servizio entro 10 secondi (il tempo di timeout si gestisce tramite web.config) l’utente viene cancellato dalla lista degli utenti connessi.

E’ sufficiente inserire lo ScriptManager in tutte le pagine (ad esempio tramite MasterPage o da codice) e il sistema viene esteso a tutta l’applicazione web.

Qui si trova il progetto di esempio: EyeOpen.UsersMonitor.Web.

Matteo Migliore.
7 Comments Filed Under [ ASP.NET ]

Comments

# re: [ASP.NET] Sistema realtime di rilevamento degli utenti connessi
Gravatar Io ritengo la tua soluzione più che accettabile.
A cosa può servire.....
ipotizziamo che io abbia venduto al cliente un numero preciso di licenze. Devo controllare quanti utenti sono collegati simultaneamente con una precisione molto alta.

Grazie Matteo
Gianni
Left by Gianni on 7/8/2008 9:34 AM
# re: [ASP.NET] Sistema realtime di rilevamento degli utenti connessi
Gravatar @Claudio: si può abbassare la frequenza con cui i client chiamano il servizio. Non ho tempo di fare test di carico sulla banda, perchè è l'unica cosa ad essere consumata, CPU e RAM sono praticamente ininfluenti. Quindi anche con 100.000 utenti (ho lavorato su applicazioni con questo carico) il lavoro sarebbe minimo, e si può comunque scalare su altri web server nel caso in cui la feature richiesta sia indispensabile.

Matteo Migliore.
Left by Matteo Migliore on 7/8/2008 10:45 AM
Comments have been closed on this topic.