Las variables de sesión en ASP.NET se guardan por defecto en el modo "InProc".
Si deseamos hacer persistente esta información debemos utilizar otros modos como "StateServer" o "SQLServer".
Si optamos por ésta última opción, Microsoft nos ofrece herramientas para automatizar esos procesos.
1. Base de Datos
En la ruta C:\Windows\Microsoft.NET\Framework\ del servidor donde vayamos a incluir la base de datos,
en el directorio de la versión de Framework que utilicemos (por ejemplo v4.0.30319) encontraremos el ejecutable aspnet_regsql.exe
que tendremos que ejecutar con permisos de administrador de SQL Server, los parámetros más comunes son:
- -S <servidor>
- Instancia de SQL Server (7.0 o superior) con la que trabajar.
- -E
- Autenticación con la credenciales de Windows.
- -U <usuario>
- Nombre de usuario de SQL Server para la autenticación.
- -P <contraseña>
- Contraseña de SQL Server para la autenticación.
- -ssadd
- Agrega la compatibilidad para el estado de sesión en el modo "SQLServer".
- -ssremove
- Elimina la compatibilidad para el estado de sesión en el modo "SQLServer".
- -sstype t|p|c
- Tipo de compatibilidad
- t Base de datos "tempdb" los datos no se guardan si se reinicia SQL.
- p Base de datos predeterminada "ASPState"
- c Base de datos personalizada
- Tipo de compatibilidad
- -d <base de datos>
- Base de datos personalizada de la opción -sstype c
Como ejemplo ejecutaríamos desde la ruta C:\Windows\Microsoft.NET\Framework\v4.0.30319
el comando aspnet_regsql.exe -S SE41SDB31\SQLSERVER2008P -U TURNOSASPRE -P _TURNOSASPRE_ -ssadd -sstype c -d TurnoSASPRE
Una vez ejecutado nos creará las tablas [ASPStateTempSessions] y [ASPStateTempApplications] en la base de datos elegida (por defecto o personalizada)
donde se guardarán automáticamente las variables de sesión y aplicación respectivamente.
2. Código Fuente
En el código, para implementar esta funcionalidad hay que hacer dos actuaciones:
- Hacer [Serializable] todos las clases que incluyamos en las variables de sesión.
- Incluir en el archivo Web.Config la sección "SesionState"
- <sessionState mode="SQLServer" allowCustomSqlDatabase="true"
sqlConnectionString="Data Source=nombreServidor; Initial Catalog=nombreBaseDatos; User ID=nombreUsuario; password=contraseñaUsuario"
cookieless="false" timeout="minutosTimeOut" />
- <sessionState mode="SQLServer" allowCustomSqlDatabase="true"
En el caso de que la base de datos seleccionada no estuviera disponible bastaría con sustituir la sección anterior por <sessionState timeout="minutosTimeOut"/>
lo que indicaría el modo por defecto "InProc".