Em alguns sistemas web pode ser interessante saber quantos usuários estão on-line, ou seja, quantos usuários estão acessando o sistema em um dado momento. A idéia é ter um contador que seja incrementado cada vez que alguém acessa o sistema e, também, seja decrementado quando um usuário sair do sistema. Para isso precisamos ter um local onde este contador possa ser armazendo e incrementado sempre que um usuário acessar nosso sistema. O problema começa na hora de decrementar quando usuário sai.
É comum que coloquemos no sistema um botão de sair para que o usuário clique e assim o sistema seja informado quando algum usuário fechar o sistema. Mas nem sempre o usuário clica neste botão. Muitas vezes o browser é fechado antes do contador ser decrementado. A insersão de um código em javascript chamando outra página que, por sua vez, faz o decremento do contador pode ser utilizada.
Minha dica é uma solução bem simples, usando o arquivo Global.asax e a classe Application. No arquivo Global.asax contém vários eventos que são disparados em momentos especias durante a execução do site. Veja alguns:
- Application_Error: Disparado sempre que ocorre uma exceção não tratada.
- Application_Start: Disparado quando a aplicação é iniciada. Normalmente no primeiro Request do site, ou seja na primeira vez que o sistema é chamado, após o Start ou Re-Start do servidor Web (IIS).
- Application_End: Disparado quando o sistema web está sendo encerrado. Normalmente isso ocorre quando o servidor web está sendo interrompido por qualquer motivo.
- Session_Start: Disparado quando uma nova sessão de usuário é iniciada.
- Session_End: Disparado quando a sessão de usuário é encerrada.
Esses e outros eventos podem ser utilizados para vários fins.
Falando um pouco sobre a classe Application… Existe algumas maneiras de fazer com que variáveis sejam passadas de uma página pra outra. As duas abaixos são bem interessantes:
- Variáveis de Sessão: Uma sessão é criada sempre que um navegador faz uma chamada para um servidor web, ou seja, sempre que o navegador abre um site. Váriaveis de sessão podem ser criadas e ficam disponíveis em todas as chamadas a páginas do site. A sessão só é encerrada após um tempo de inatividade entre o navegador e o servidor web. Este tempo é configurável. Essas váriaves só são vista na sessão do usuário, ou seja, uma sessão não pode ver o conteúdo de outras sessões. Sessões são criadas no lado do servidor. Essas variáveis são gerenciadas através da classe Session.
- Variáveis de Aplicação: Uma variável de aplicação é vista pela aplicação. Isso significa que enquanto a aplicação tiver ativa a variável está dispníviel. Somente quando o servidor for reiniciado essas variáveis deixam de exisitir. E mais: variáveis de aplicação são vistas por todos usuários da aplicação. No momento que o browser chamar alguma página do site, as variáveis de aplicação estarão disponívies. A classe que gerencia essas variáveis é a classe Application.
Na nossa dica vamos usar uma variável de aplicação para ser nosso contador de usuários on-line, bem como alguns eventos do arquivo Global.asax.
No evento Application_Start do Global.asax vamos criar uma variável de aplicação. Esta variável será inicializada sempre que o servidor der algum re-start.
protected void Application_Start(object sender, EventArgs e)
{
Application.Add(“UsuariosOnLine”, Convert.ToInt32(0));
}
No Evento Session_Start vamos colocar o incrementador do contador. Todas vez que uma nova sessão for criada o contador será incrementado. Poderia deixar pra fazer este incremento após a confirmação do login/senha do usuário. Estamos facilitando as coisas. Note também que estamos colocando o timeout da sessão em 20 minutos. Sem atividade por 20 minutos a sessão expira.
protected void Session_Start(Object sender, EventArgs e)
{
lock (typeof(HttpApplication))
{
int usuariosOnline = Convert.ToInt32(Application.Get(“UsuariosOnLine”));
usuariosOnline++;
Application.Set(“UsuariosOnLine”, usuariosOnline);
}
Session.Timeout = 20;//A sessão expira em 20 minutos
}
Quando a sessão expirar o contador deverá ser decrementado.
protected void Session_End(Object sender, EventArgs e)
{
lock (typeof(HttpApplication))
{
int usuariosOnline = Convert.ToInt32(Application.Get(“UsuariosOnLine”));
usuariosOnline–;
Application.Set(“UsuariosOnLine”, usuariosOnline);
}
}
Adicionei um lock ao processo pra evitar que esse processo seja disparado ao mesmo tempo por dois ou mais usuários diferentes.
Pronto. Muito simples, não acha? Inclusive voce pode acessar a sua variável de aplicação (o contador) de qualquer lugar da sua aplicação para mosta-la em alguma página, informando quantos usuários estão on-line naquele momento. O que está mostrando na realidade são quantas sessões estão abertas.
Se quiser, baixe o arquivo abaixo e veja a implementação que fiz para um sistema que desenvolvi. ATENÇÃO: O arquivo não é um .doc e sim um .zip. Renomei após o download.
É isso aí. Qualquer dúvida é só falar. Se tiver uma proposta melhorada sobre o assunto comente aqui.
Comentários