¿Cuál es la forma más fácil y discreta de mantener viva una sesión ASP.NET siempre que el usuario tenga la ventana del navegador abierta? ¿Son llamadas AJAX cronometradas? Quiero evitar lo siguiente: a veces los usuarios mantienen su ventana abierta durante mucho tiempo, luego ingresan cosas y, al enviar, ya no funciona nada porque la sesión del lado del servidor expiró. No quiero aumentar el valor de tiempo de espera durante más de 10 minutos en el servidor, ya que quiero que las sesiones cerradas (cerrando la ventana del navegador) se agoten rápidamente.
¿Sugerencias, ejemplos de código?
Respuestas:
Utilizo JQuery para realizar una simple llamada AJAX a un controlador HTTP ficticio que no hace más que mantener viva mi sesión:
El controlador de sesión puede ser tan simple como:
La clave es agregar IRequiresSessionState; de lo contrario, la sesión no estará disponible (= nulo). Por supuesto, el controlador también puede devolver un objeto serializado JSON si algunos datos deben devolverse al JavaScript de llamada.
Disponible a través de web.config:
añadido de balexandre el 14 de agosto de 2012
Me gustó tanto este ejemplo, que quiero mejorar con HTML / CSS y la parte de ritmo
cambia esto
dentro
y añadir
HTML y CSS
aquí hay un ejemplo en vivo solo para la parte de la paliza: http://jsbin.com/ibagob/1/
fuente
DateTime.Now
fue solo para hacer evidente cuándo se actualizó la sesión por última vez a través del latido.Si está utilizando ASP.NET MVC, no necesita un controlador HTTP adicional ni algunas modificaciones del archivo web.config. Todo lo que necesita, solo para agregar una acción simple en un controlador Inicio / Común:
, escriba un fragmento de código JavaScript como este (lo he puesto en uno de los archivos JavaScript del sitio):
e inicialice esta funcionalidad llamando a una función de JavaScript:
¡Tenga en cuenta! He implementado esta funcionalidad solo para usuarios autorizados (no hay razón para mantener el estado de la sesión para los invitados en la mayoría de los casos) y la decisión de mantener el estado de la sesión activo no solo se basa en si el navegador está abierto o no, pero el usuario autorizado debe realizar alguna actividad en el sitio (mueva el mouse o escriba alguna tecla).
fuente
@Url.Action("KeepSessionAlive","Home")
en la función de inicialización para no tener que codificar la URL y también lanzar el primer bloque dentro de un IIFE y simplemente exportarlo,SetupSessionUpdater
ya que eso es lo único que debe invocarse externamente, algo como esto: SessionUpdater.jssetInterval(KeepSessionAlive, 300000)
Cada vez que realiza una solicitud al servidor, se restablece el tiempo de espera de la sesión. Por lo tanto, puede realizar una llamada ajax a un controlador HTTP vacío en el servidor, pero asegúrese de que la caché del controlador esté deshabilitada; de lo contrario, el navegador almacenará en caché su controlador y no realizará una nueva solicitud.
KeepSessionAlive.ashx.cs
.JS:
@veggerby: no hay necesidad de la sobrecarga de almacenar variables en la sesión. Basta con realizar una solicitud al servidor.
fuente
¿Realmente necesita mantener la sesión (¿tiene datos en ella?) O es suficiente falsificar esto reinstalando la sesión cuando entra una solicitud? Si es el primero, utilice el método anterior. Si es el segundo, intente algo como usar el controlador de eventos Session_End.
Si tiene autenticación de formularios, obtendrá algo en Global.asax.cs como
Y establece la duración del ticket mucho más larga que la duración de la sesión. Si no se está autenticando o está utilizando un método de autenticación diferente, existen trucos similares. La interfaz web de Microsoft TFS y SharePoint parecen usarlos; el regalo es que si hace clic en un enlace en una página obsoleta, obtiene mensajes de autenticación en la ventana emergente, pero si solo usa un comando, funciona.
fuente
simplemente puede escribir este código en su archivo de script java, eso es todo.
El
(20-1)*60*1000
es tiempo de actualización, se actualizará el tiempo de espera de sesión. El tiempo de espera de actualización se calcula como el tiempo predeterminado fuera de iis = 20 minutos, lo que significa que 20 × 60000 = 1200000 milisegundos - 60000 milisegundos (un minuto antes de que expire la sesión) es 1140000.fuente
Aquí hay una solución alternativa que debería sobrevivir si la PC del cliente entra en modo de suspensión.
Si tiene una gran cantidad de usuarios registrados, utilícelo con precaución, ya que podría consumir mucha memoria del servidor.
Después de iniciar sesión (hago esto en el evento LoggedIn del control de inicio de sesión)
fuente
Pasé unos días tratando de averiguar cómo prolongar la sesión de un usuario en WebForms a través de un cuadro de diálogo emergente que le da al usuario la opción de renovar la sesión o permitir que caduque. Lo # 1 que debe saber es que no necesita nada de este elegante 'HttpContext' en algunas de las otras respuestas. Todo lo que necesita es $ .post () de jQuery; método. Por ejemplo, mientras depuraba usé:
y en su sitio en vivo usaría algo como:
Es tan fácil como eso. Además, si desea solicitar al usuario la opción de renovar su sesión, haga algo similar a lo siguiente:
No olvide agregar el cuadro de diálogo a su html:
fuente
Con respecto a la solución de veggerby, si está intentando implementarla en una aplicación VB, tenga cuidado al intentar ejecutar el código suministrado a través de un traductor. Lo siguiente funcionará:
Además, en lugar de llamar como heartbeat (), funciona como:
En cambio, llámalo como:
Número uno, setTimeout solo se dispara una vez, mientras que setInterval se dispara repetidamente. Número dos, llamar a heartbeat () como una cadena no me funcionó, mientras que llamarlo como lo hizo una función real.
Y puedo confirmar absolutamente al 100% que esta solución superará la ridícula decisión de GoDaddy de forzar una sesión de grupo de aplicaciones de 5 minutos en Plesk.
fuente
Aquí la versión del complemento JQuery de la solución Maryan con optimización de manejo. ¡Solo con JQuery 1.7+!
y cómo se importa en su * .cshtml
fuente
[Tarde a la fiesta ...]
Otra forma de hacer esto sin la sobrecarga de una llamada Ajax o un controlador WebService es cargar una página ASPX especial después de un período de tiempo determinado (es decir, antes del tiempo de espera del estado de la sesión, que suele ser de 20 minutos):
La
KeepAlive.aspx
página es simplemente una página vacía que no hace más que tocar / actualizar elSession
estado:Esto funciona creando un
img
elemento (imagen) y obligando al navegador a cargar su contenido desde laKeepAlive.aspx
página. La carga de esa página hace que el servidor toque (actualice) elSession
objeto, extendiendo la ventana de tiempo deslizante de expiración de la sesión (generalmente otros 20 minutos). El navegador descarta el contenido real de la página web.Una forma alternativa, y quizás más limpia, de hacer esto es crear un nuevo
iframe
elemento y cargar laKeepAlive.aspx
página en él. Eliframe
elemento está oculto, por ejemplo, convirtiéndolo en un elemento secundario de undiv
elemento oculto en algún lugar de la página.La actividad en la propia página se puede detectar interceptando las acciones del mouse y del teclado para todo el cuerpo de la página:
No puedo atribuirme el mérito de esta idea; ver: https://www.codeproject.com/Articles/227382/Alert-Session-Time-out-in-ASP-Net .
fuente