2009-11-30 15 views
5

Tengo un requisito de que mi sitio siempre muestre el número de usuarios actualmente en línea. Por ejemplo, "35741 usuarios actualmente en línea". Esto no se basa en un inicio de sesión, simplemente cuántos usuarios se encuentran actualmente en mi sitio. He intentado usar Session Start/Session End para esto, sin embargo, el final de la sesión no es confiable. Por lo tanto, obtengo números inflados, ya que el inicio de mi sesión agrega números, pero el final de la sesión no los elimina porque no se activa.La mejor manera de realizar un seguimiento de los usuarios en línea actuales

No se obtiene información adicional de esto (informes, etc.), simplemente se solicita que aparezca el número. Solicitud muy simple que se está convirtiendo en un gran negocio. Cualquier ayuda es apreciada.

EDIT:

debería especificar que también he intentado usar una base de datos para esto. Tabla simple que contiene una ID de sesión y una última columna de actividad. Con cada visita a la página, verifico si la sesión está en mi base de datos. Si no, inserte. Si es así, actualice con el tiempo de actividad. Luego ejecuto un procedimiento que barre la base de datos buscando sesiones sin actividad en los últimos 20 minutos. Este enfoque pareció matar mi servidor SQL y/o IIS. Tuve que reiniciar el sitio.

+2

Su mejor apuesta es Aleatorio. Siguiente. Todo lo demás es tan confiable. –

+0

@YuriyFaktorovich, técnicamente cierto :) –

Respuesta

8

La mejor manera es como usted lo hace, pero agote el tiempo mediante la actividad. Si una sesión determinada no accede a una página en 5 minutos aproximadamente, puede considerar que ya no están activas.

+2

+1 \t Escribía lo mismo –

+0

Justo cuando iba a presionar enter ... – Dave

+0

¡Escribí lo mismo! – Larsenal

2

Para cada acción del usuario que puede registrar, debe considerarlos "en línea" durante un determinado intervalo de tiempo. Según el sitio, puede establecerlo en 5 minutos. La solicitud web real debería tomar menos de un segundo. Tiene que hacer algunos supuesto sobre cuánto tiempo pueden permanecer en esa página y no hacer nada más que ser considerado en línea.

Este enfoque requiere que realice un seguimiento de la última actividad de cada usuario.

2

Uso Performance Counters:

  • servidor de estado de las sesiones activas: El número de sesiones de usuario activas.
3

Si está utilizando ASP.Net membresía, echar un vistazo a GetNumberOfUsersOnline.

+0

OP: "Esto no está ** basado en un inicio de sesión", "Membership.GetNumberOfUsersOnline" se basa en los usuarios que han iniciado sesión. –

0

Ampliando lo que se dice sedoso en su respuesta - ya que http es apátrida para determinar si el usuario está actualmente "en línea" realmente solo puede rastrear cuánto tiempo ha pasado desde que el usuario accedió a su sitio y determinar cuánto tiempo tu consideras que aún estás activo.

Como ha indicado que esto no se basa en el inicio de sesión de los usuarios, es simple la cantidad de direcciones IP diferentes de las que ha recibido solicitudes en los últimos 5 minutos (o el tiempo de espera 'en línea'). .

0

No use sesiones para esto a menos que también necesite sesiones para otra cosa; es exagerado de lo contrario.

Asumiendo una instalación de servidor único, hacer algo como esto:

  1. Para cada usuario, emitir una cookie que contiene un identificador único
  2. Mantener una tabla estática de identificadores únicos y hora
  3. su último acceso
  4. En un HttpModule (o Global.asax), ingrese nuevos usuarios en la tabla y actualice sus tiempos de acceso (use el bloqueo apropiado para evitar condiciones de carrera)
  5. Periódicamente, ya sea desde un hilo de fondo o en línea con una solicitud de usuario , eliminar entradas de la tabla que no han hecho una solicitud dentro de los últimos N minutos. Es posible que también desee admitir una función explícita de "cierre de sesión".
  6. Informe el número de personas en línea como el tamaño de la tabla

Si usted hace uso de las sesiones, se puede utilizar el ID de sesión como identificador único. Sin embargo, tenga en cuenta que los ID de sesión no se emiten hasta que almacene algo en el diccionario de sesión, a menos que tenga configurado un evento Session_Start().

En un escenario de equilibrio de carga o de jardín web, se vuelve un poco más complicado, pero puede utilizar la misma idea básica, simplemente persistiendo la información en una base de datos en lugar de en la memoria.

0

Cuando el usuario inicia sesión escribe su nombre de usuario en HttpContext.Current.Cache con una caducidad móvil (digamos 20 minutos).

Luego en Global.asax.cs en Application_PreRequestHandlerExecute "toque" la entrada de caché para los usuarios actuales para que restablezca la caducidad móvil.

Cuando un usuario cierra la sesión explícitamente, quite su nombre de usuario de HttpContext.Current.Cache.

Si hace esto, en cualquier momento, HttpContext.Current.Cache.Count le dará el # de usuarios actuales.

Nota: esto es asumiendo que no está utilizando la memoria caché para otros fines.

Cuestiones relacionadas