hay métodos para hacer esto en los proveedores de membresía asp.net, específicamente, IsUserOnline() y algo así como CountUsersOnline(). El único problema con estos métodos es que son realmente cojos. Dependen del LastActivityDate() del proveedor de membresía y de una ventana que puede establecer en web.config. En otras palabras, el usuario se considera en línea si su último encuentro con el proveedor de membresía más la ventana de tiempo en web.config no ha expirado.
Tomamos este scenairo y logramos que funcionase para nosotros configurando un servidor Comet y haciendo ping al servidor web cada diez minutos. Cuando se hace ping al servidor web, actualiza el LastActivityDate del proveedor de membresía.
Configuramos la ventana de actividad en 12 minutos, así como el temporizador de sesión. Esto nos permite determinar quién está en línea con una precisión de aproximadamente diez minutos.
Aquí está la línea en Web.config:
<membership userIsOnlineTimeWindow="12">
Aquí es servidor de jQuery Comet:
function getData() {
$.getJSON("/Account/Timer", gotData);
}
// Whenever a query stops, start a new one.
$(document).ajaxStop(getData, 600000);
// Start the first query.
getData();
Aquí es nuestro código de servidor:
public JsonResult Timer()
{
MembershipUser user = Membership.GetUser(User.Name);
user.LastActivityDate = DateTime.Now;
Membership.UpdateUser(user);
// You can return anything to reset the timer.
return Json(new { Timer = "reset" }, JsonRequestBehavior.AllowGet);
}
¿Dónde agrego este código de servidor? – DoIt