Foros del Web » Programando para Internet » ASPX (.net) »

Necesito alguna buena idea para controlar las sesiones

Estas en el tema de Necesito alguna buena idea para controlar las sesiones en el foro de ASPX (.net) en Foros del Web. Buenos días. Necesito mostrar en una página la siguiente información: - Número de usuarios activos anónimos - Número de usuarios activos autenticados La idea que ...
  #1 (permalink)  
Antiguo 08/10/2010, 05:59
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Necesito alguna buena idea para controlar las sesiones

Buenos días.
Necesito mostrar en una página la siguiente información:
- Número de usuarios activos anónimos
- Número de usuarios activos autenticados
La idea que he desarrollado es muy sencilla, pero en realidad no funciona.
Básicamente se trata del siguiente código en global.asax:
Código VB.NET:
Ver original
  1. Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
  2.         Application("UsuariosActivos") = 0
  3.         Application("UsuariosActivosAutenticados") = 0
  4.     End Sub
  5.  
  6.     Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
  7.         Application.Lock()
  8.         Application("UsuariosActivos") += 1
  9.         Application.UnLock()
  10.         If User.Identity.IsAuthenticated Then
  11.             Application.Lock()
  12.             Application("UsuariosActivosAutenticados") += 1
  13.             Application.UnLock()
  14.         End If
  15.     End Sub
  16.  
  17.     Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
  18.         If User.Identity.IsAuthenticated Then
  19.             Application.Lock()
  20.             Application("UsuariosActivosAutenticados") -= 1
  21.             Application.UnLock()
  22.         End If
  23.         Application.Lock()
  24.         Application("UsuariosActivos") -= 1
  25.         Application.UnLock()
  26.     End Sub
Parece muy simple y muy bonito, la pega es que no funciona.
El número de usuarios siempre va creciendo, y nunca decrece, por motivo de no ejecutar NUNCA el evento Session_End.
He buscado algo de información al respecto y, aparentemente, este evento se ejecuta al finalizar la sesión, pero sólo en caso de que el manejo de sesiones sea del tipo "InProc", que efectivamnente así es en mi aplicación. Esto se puede comprobar con la siguiente linea:
Código VB.NET:
Ver original
  1. Session.Mode.ToString
Pero mi problema es que nunca se ejecuta el código del método Session_End.
En principio, el tiempo de sesión de mi aplicación son los 20 minutos por defecto que aplica IIS, y por lo tanto, el comportamiento que espero es que tras esos 20 minutos de inactividad, la sesión finalice y se ejecute el código de Session_End, pero no es así.
¿Alguien me puede iluminar?
Gracias compañeros.
__________________
..:: moNTeZIon ::..
  #2 (permalink)  
Antiguo 08/10/2010, 12:02
Avatar de jaullo  
Fecha de Ingreso: abril-2009
Mensajes: 994
Antigüedad: 15 años
Puntos: 30
Respuesta: Necesito alguna buena idea para controlar las sesiones

Eso depende de el metodo que uses para autenticarlos, usas las tablas por defecto de asp.net u algo personalizado?
__________________
http://geekswithblogs.net/jaullo/Default.aspx
Si te he ayudado regalame Karma positivo!!!
  #3 (permalink)  
Antiguo 09/10/2010, 11:24
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Respuesta: Necesito alguna buena idea para controlar las sesiones

Gracias por responder jaullo.
Uso algo personalizado.
__________________
..:: moNTeZIon ::..
  #4 (permalink)  
Antiguo 12/10/2010, 11:56
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Respuesta: Necesito alguna buena idea para controlar las sesiones

Hola de nuevo.
Se me ha ocurrido una sencilla idea que considero medianamente "digna".
Cabe comentar que me han aconsejado utilizar membership y role provider para controlar las sesiones de forma precisa. Pero después de hacer algunas pruebas he visto que se trataba de bastantes cambios en la aplicación tal y como está montada, y como decía, la forma en que lo he realizado ofrece un buen resultado, si no eres muy exigente.
He montado una tabla Sesiones en la base de datos, con los campos CodigoSesion, FechaHora, IP, IDCliente, y luego sus clases para las inserciones, etc.
Este es el código del global.asax
Código VB.NET:
Ver original
  1. Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
  2.         'Obtenemos los datos de la sesion para guardarlos en la tabla Tienda_Sesiones
  3.         Session("CodigoSesion") = Guid.NewGuid.ToString
  4.         Dim misDetallesSesion As New DetallesSesion
  5.         misDetallesSesion.CodigoSesion = Session("CodigoSesion")
  6.         misDetallesSesion.FechaHora = Now
  7.         misDetallesSesion.IP = Request.ServerVariables("REMOTE_HOST")
  8.         misDetallesSesion.IDCliente = 0
  9.         If User.Identity.IsAuthenticated Then
  10.             FormsAuthentication.SetAuthCookie(User.Identity.Name, True)
  11.             'Al estar autenticado, nos guardamos el IDCliente para la tabla Tienda_Sesiones
  12.             misDetallesSesion.IDCliente = User.Identity.Name
  13.         End If
  14.         Dim objSesiones As New SesionesDB
  15.         objSesiones.Insertar(misDetallesSesion)
  16.         'Y eliminamos las sesiones expiradas
  17.         objSesiones.EliminarExpiradas()
  18.     End Sub

EliminarExpiradas lo que hace es eliminar aquellos registros con FechaHora < DateAdd(DateInterval.Minute, -FormsAuthentication.Timeout.Minutes, Now)

Luego, en cada Request del usuario voy actualizando el campo FechaHora de su sesión.

Y para controlar si es un usuario autenticado o anónimo, en la pantalla de login guardo el IDCliente del usuario en el campo IDCliente de su sesión correspondiente.
De la misma forma, en el codigo de Logout también limpio el campo IDCliente del usuario que se está deslogando.

Si alguien le interesa esta solución en más detalle podemos comentarlo aquí.
Saludos.
__________________
..:: moNTeZIon ::..

Última edición por moNTeZIon; 12/10/2010 a las 12:02

Etiquetas: controlar, idea, sesiones, aspx
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:06.