Como mantener viva la sesión en ASP.Net

 Este es un artículo basado en el artículo "Problema de expiración de la sesión en ASP.Net" de un blog (el autor es Manuel Cárdenas de Nidea Soluciones) que ya no se actualiza así que lo pongo en mi blog para evitar que si lo necesito en el futuro, y lo busque en ese blog, no lo vaya a encontrar.

El problema a solucionar es como mantener viva la sesión en ASP.Net. La implementación es sencilla, pero claramente se puede mejorar, cosa que hicimos en una aplicación, y aún se sigue usando.

En el artículo original se mencionaban 3 formas de evitar que la sesión "muera", pero las dos primeras involucraban configuraciones o acceso al servidor web. La tercera, la cual vamos a describir, está en nuestras manos, ya que consiste en modificaciones a la aplicación en sí y no a la configuración del servidor o del pool de la aplicación.

Solución: Servicio web de Echo

Normalmente, un portal web dispone de dos partes, la pública (en la que normalmente se puede funcionar con cookies) y la privada en la que trabajaremos con sesiones. Es en la parte privada donde utilizaremos esta opción. 

La idea es implementar un servicio web que simplemente realice un eco, reciba un parámetro y lo devuelva. Habilitamos la sesión para el servicio web con lo que cada vez que se llame a este servicio, la cuenta de expiración de la sesión se reinicirá. Desde las página de gestión se llama, vía AJAX, periódicamente (yo lo tengo cada 50 segundos) a dicho servicio web para que no reinicie la cuenta. De forma esquemática, la solución es la siguiente:



El código para el servicio web es el siguiente:


Tenemos que introducir el using System.Web.Script.Services para poder utilizar este servicio web vía AJAX. Además, la definición del servicio web incluye la sentencia [WebMethod(true)] indicando que se utilizará la sesión en ese método del servicio web. 

Para llamar a dicho método desde la página maestra (lo normal) o desde cualquier página de nuestra aplicación utilizaremos el siguiente código:

a. Incluir una referencia web al servicio web creado.

b. Dar de alta el servicio web mediante el ScriptManager de la página
En la propiedad Path pondremos la ubicación del fichero .asmx (servicio web). Si, al crear el servicio web, separados el código del fichero, se creará un fichero .asmx con la definición del servicio web donde le hayamos dicho y un fichero .cs con los códigos dentro de la carpeta App_Code.


c. Crear la función Javascript que llama al servicio web



d. Crear el temporizador para que se repita la llamada cada x segundos
Ponemos la función en el onload de la página para que se ejecute al iniciar la página. En este caso esta puesto que se repita la llamada cada 50 segundos (50.000 milisegundos)



Esta última es una solución sencilla que nos puede servir en cualquier entorno en el que trabajemos con aplicaciones asp.net. Utilizando el servicio de echo, nos aseguramos que la sesión del usuario no va a expirar independientemente del tiempo que esté sin hacer ningún postback. En el caso que el usuario cierre la ventana del explorador, se deja de llamar al servicio con lo que la sesión expirará en los 5 minutos correspondientes. Por supuesto, siempre podemos colocar el botón de cerrar que matará la sesión. 

El artículo original es del 2009, como verán el código es bastante antiguo, y se aplica para ASP.Net Web Forms pero también funciona con MVC que es donde yo lo usé, y ya se habrán dado cuenta que muchas partes se pueden reemplazar con javascript puro, lo importante es el concepto a aplicar.



Comentarios