Compartir a través de


Proveedor de almacén de estados de sesión de ejemplo

Actualización: noviembre 2007

Describe la implementación de un proveedor de almacén de estados de sesión personalizado que utiliza el proveedor de datos de .NET Framework para ODBC con el fin de administrar la información de la sesión en una base de datos de Microsoft Access.

Los temas siguientes incluyen el código de la implementación de un proveedor de almacén de estados de sesión de ejemplo. El proveedor de ejemplo utiliza las clases System.Data.Odbc para almacenar y recuperar información sobre la sesión mediante una base de datos de Microsoft Access.

En este tema se describen los detalles de la implementación del proveedor de almacén de estados de sesión de ejemplo. Asimismo, se describe la generación del ejemplo y la configuración de una aplicación de ASP.NET para que utilice el proveedor de ejemplo.

El código del proveedor de ejemplo se puede encontrar en el tema Cómo: Obtener un ejemplo de proveedor de almacén de estados de sesión.

Esquema de la base de datos

El proveedor de estados de sesión de ejemplo utiliza una sola tabla denominada Sessions para administrar la información de sesión. Para crear la tabla de Microsoft Access que utiliza el proveedor de ejemplo, ejecute la consulta de definición de datos siguiente en una base de datos nueva o en una base de datos existente de Microsoft Access.

CREATE TABLE Sessions
(
  SessionId       Text(80)  NOT NULL,
  ApplicationName Text(255) NOT NULL,
  Created         DateTime  NOT NULL,
  Expires         DateTime  NOT NULL,
  LockDate        DateTime  NOT NULL,
  LockId          Integer   NOT NULL,
  Timeout         Integer   NOT NULL,
  Locked          YesNo     NOT NULL,
  SessionItems    Memo,
  Flags           Integer   NOT NULL,
    CONSTRAINT PKSessions PRIMARY KEY (SessionId, ApplicationName)
)

Acceso al Registro de eventos

Si el proveedor de ejemplo encuentra una excepción mientras trabaja con el origen de datos, escribe los detalles de la excepción en el Registro de eventos de la aplicación en lugar de devolver la excepción en la aplicación ASP.NET. Esto constituye una medida de seguridad para evitar que se exponga información confidencial sobre el origen de datos en la aplicación ASP.NET.

El proveedor de ejemplo establece la propiedad del evento Source en el valor "OdbcSessionStateStore". Antes de que la aplicación ASP.NET pueda escribir las excepciones correctamente en el Registro de eventos de la aplicación, deberá crear la clave de Registro siguiente:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\OdbcSessionStateStore

Si no desea que el proveedor de ejemplo escriba las excepciones en el Registro de eventos, puede definir el atributo personalizado del archivo Web.config writeExceptionsToEventLog en false.

Compatibilidad con el evento Session_OnEnd

El proveedor del almacén de estados de sesión de ejemplo no es compatible con el evento Session_OnEnd definido en el archivo Global.asax, puesto que no hay modo de que la base de datos de Microsoft Access notifique al proveedor del almacén de estados de sesión que ha transcurrido la fecha y la hora de expiración. El proveedor del almacén de estados de sesión debe consultar esta información. No se puede predecir cuándo se utilizará este proveedor y, por tanto, es bastante improbable que el evento Session_OnEnd se desencadene en el momento exacto en el que finaliza la sesión. Como resultado, la implementación del método SetItemExpireCallback en el proveedor del almacén de estados de sesión de ejemplo devuelve false para notificar a SessionStateModule que el evento Session_OnEnd no es compatible.

Limpieza de los datos de una sesión expirada

Puesto que el proveedor del almacén de estados de sesión de ejemplo no es compatible con el evento Session_OnEnd, no limpia automáticamente los datos de los elementos de la sesión. Es conveniente que elimine periódicamente la información de las sesiones expiradas del almacén de datos mediante el siguiente código:

Dim commandString As String = "DELETE FROM Sessions WHERE Expires < ?"
Dim conn As OdbcConnection = new OdbcConnection(connectionString)
Dim cmd As OdbcCommand = New OdbcCommand(commandString, conn)
cmd.Parameters.Add("@Expires", OdbcType.DateTime).Value = DateTime.Now
conn.Open()
cmd.ExecuteNonQuery()
conn.Close()
string commandString = "DELETE FROM Sessions WHERE Expires < ?";
OdbcConnection conn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand(commandString, conn);
cmd.Parameters.Add("@Expires", OdbcType.DateTime).Value = DateTime.Now;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

Creación del proveedor de ejemplo

Para utilizar el proveedor de ejemplo, puede colocar el código fuente en el directorio App_Code de la aplicación. Tenga en cuenta que si el directorio App_Code de la aplicación ya contiene código fuente, debe agregar la versión del proveedor de ejemplo que esté escrita en el mismo lenguaje que el código existente del directorio. ASP.NET lo compilará cuando se solicite la aplicación.

También puede compilar este proveedor como biblioteca y colocarlo en el directorio Bin de la aplicación Web o asignarle un nombre seguro y colocarlo en la GAC. El comando siguiente muestra cómo se compila el proveedor de ejemplo mediante el compilador de la línea de comandos después de que el código de ejemplo se copie en un archivo denominado OdbcSessionStateStore.vb en Visual Basic y OdbcSessionStateStore.cs en C#.

vbc /out:OdbcSessionStateStore.dll /t:library OdbcSessionStateStore.vb /r:System.Web.dll /r:System.Configuration.dll
csc /out:OdbcSessionStateStore.dll /t:library OdbcSessionStateStore.cs /r:System.Web.dll /r:System.Configuration.dll

Uso del proveedor de ejemplo en una aplicación ASP.NET

En el ejemplo siguiente se muestra el archivo Web.config de una aplicación ASP.NET configurada para que utilice el proveedor de ejemplo. El ejemplo utiliza un DSN ODBC denominado "SessionState" para obtener la información de conexión de la base de datos de Microsoft Access. Para utilizar el proveedor de ejemplo, necesitará crear el DSN del sistema "SessionState" o proporcionar una cadena de conexión ODBC válida en la base de datos.

En el ejemplo se asume que el sitio Web se ha configurado para que utilice la autenticación de formularios e incluya una página ASP.NET denominada login.aspx que permita que los usuarios inicien sesión.

<configuration>
  <connectionStrings>
    <add name="OdbcSessionServices" connectionString="DSN=SessionState;" />
  </connectionStrings>

  <system.web>
    <sessionState 
      cookieless="true"
      regenerateExpiredSessionId="true"
      mode="Custom"
      customProvider="OdbcSessionProvider">
      <providers>
        <add name="OdbcSessionProvider"
          type="Samples.AspNet.Session.OdbcSessionStateStore"
          connectionStringName="OdbcSessionServices"
          writeExceptionsToEventLog="false" />
      </providers>
    </sessionState>
  </system.web>
</configuration>

Vea también

Conceptos

Implementar un proveedor de almacén de estados de sesión

Información general sobre el estado de sesión de ASP.NET

Información general sobre la administración de estados de ASP.NET