estado de sesión de ASP.NET

 

Rob Howard
Microsoft Corporation

28 de diciembre de 2000

Nota El código de este artículo está destinado a la versión beta de Microsoft .NET. Es posible que algunos de los códigos requieran volver a trabajar para funcionar correctamente en versiones posteriores del .NET Framework.

En la columna de este mes vamos a recoger el ritmo un poco y profundizar directamente en algunas de las nuevas características de ASP.NET. Empezaremos comparando ASP.NET estado de sesión con ASP clásico y, a continuación, mostraremos código y ejemplos para configurar y usar ASP.NET estado de sesión.

Una sesión se define como el período de tiempo que un usuario único interactúa con una aplicación web. Los desarrolladores de Active Server Pages (ASP) que desean conservar datos para sesiones de usuario únicas pueden usar una característica intrínseca conocida como estado de sesión.

Mediante programación, el estado de sesión no es más que la memoria en forma de una tabla hash o diccionario, por ejemplo, pares clave-valor, que se pueden establecer y leer durante la sesión de un usuario. Por ejemplo, un usuario selecciona acciones para realizar un seguimiento y la aplicación web puede almacenar estos valores en la instancia de sesión ASP del usuario:

Session("Stocks") = "MSFT; VRSN; GE"

En las páginas posteriores, estos valores se leen y la aplicación web tiene acceso a estos valores sin que el usuario vuelva a escribirlos:

' Get Stocks, split string, etc.
Dim StockString
StockString = Session("Stocks")

ASP mantiene el estado de sesión proporcionando al cliente una clave única asignada al usuario cuando comienza la sesión. Esta clave se almacena en una cookie HTTP que el cliente envía al servidor en cada solicitud. A continuación, el servidor puede leer la clave de la cookie e inflar de nuevo el estado de sesión del servidor.

Problemas con el estado de sesión de ASP

Los desarrolladores de ASP conocen el estado de sesión como una característica excelente, pero una que es algo limitada. Entre estas limitaciones se incluyen:

  • Proceso dependiente. El estado de sesión asp existe en el proceso que hospeda ASP; por lo tanto, las acciones que afectan al proceso también afectan al estado de sesión. Cuando se recicla o se produce un error en el proceso, se pierde el estado de sesión.
  • Limitaciones de la granja de servidores. A medida que los usuarios pasan del servidor al servidor de una granja de servidores web, su estado de sesión no los sigue. El estado de sesión de ASP es específico de la máquina. Cada servidor ASP proporciona su propio estado de sesión y, a menos que el usuario vuelva al mismo servidor, el estado de sesión no es accesible. Aunque las soluciones de enrutamiento de nivel de IP de red pueden resolver estos problemas, asegurándose de que las direcciones IP del cliente se enrutan al servidor de origen, algunos ISP eligen usar una solución de equilibrio de carga de proxy para sus clientes. La más famosa de estos es AOL. Las soluciones como AOL impiden el enrutamiento de nivel de red de las solicitudes a los servidores porque no se puede garantizar que las direcciones IP del solicitante sean únicas.
  • Cookie dependiente. Los clientes que no aceptan cookies HTTP no pueden aprovechar el estado de sesión. Algunos clientes creen que las cookies ponen en peligro la seguridad o la privacidad y, por tanto, las deshabilita, lo que deshabilita el estado de sesión en el servidor.

Estos son varios de los conjuntos de problemas que se tuvieron en cuenta en el diseño de ASP.NET estado de sesión.

estado de sesión de ASP.NET

ASP.NET estado de sesión resuelve todos los problemas anteriores asociados con el estado de sesión de ASP clásico:

  • Proceso independiente. ASP.NET estado de sesión es capaz de ejecutarse en un proceso independiente del proceso de host de ASP.NET. Si el estado de sesión está en un proceso independiente, el proceso de ASP.NET puede venir y ir mientras el proceso de estado de sesión sigue estando disponible. Por supuesto, también puede usar el estado de sesión en proceso similar al de ASP clásico.
  • Compatibilidad con configuraciones de granja de servidores. Al pasar a un modelo fuera de proceso, ASP.NET también resuelve el problema de la granja de servidores. El nuevo modelo fuera de proceso permite que todos los servidores de la granja compartan un proceso de estado de sesión. Puede implementarlo cambiando la configuración de ASP.NET para que apunte a un servidor común.
  • Cookie independiente. Aunque existen soluciones al problema de la administración de estado sin cookies para ASP clásico, no son triviales de implementar. ASP.NET, por otro lado, reduce las complejidades del estado de sesión sin cookies a una configuración sencilla.

Echemos un vistazo a cada una de estas características con más detalle, incluido cómo se configuran las opciones.

Uso del estado de sesión de ASP.NET

Las opciones de estado de sesión de ASP.NET se configuran a través del archivo de configuración XML ASP.NET config.web. Veremos config.web con más detalle en una columna posterior, pero para esta explicación del estado de sesión, echemos un vistazo brevemente.

Config.web

Hay dos tipos de archivos de configuración: un archivo de configuración de máquina y un archivo de configuración de aplicación, ambos denominados config.web. Los dos son idénticos, salvo que el archivo de configuración de la máquina aplica la configuración a todas las aplicaciones, pero los archivos de configuración de la aplicación son restrictivos o expansivos en función de la aplicación.

En beta 1, el archivo config.web de la máquina está en el directorio WinNT\Microsoft.NET\Framework\v1.0.2204 , mientras que los archivos de configuración de la aplicación opcionales existen en el directorio de la aplicación. Los archivos config.web de la aplicación son opcionales en el sentido de que si no existe un archivo config.web de aplicación, se usan en su lugar la configuración de machine config.web . ASP.NET configuración de estado de sesión se puede realizar en el archivo config.web de la máquina y reemplazarse en el archivo config.web de una aplicación determinada.

Nota: Los cambios realizados en config.web se aplican inmediatamente, a diferencia de ASP clásico, donde el servidor debe detenerse e iniciarse para que la configuración surta efecto.

Configuración de sesión

A continuación se muestra un archivo config.web de ejemplo que se usa para configurar los valores de estado de sesión para una aplicación de ASP.NET:

<configuration>
  <sessionstate 
      mode="inproc"
      cookieless="false" 
      timeout="20" 
      sqlconnectionstring="data source=127.0.0.1;user id=<user id>;password=<password>"
      server="127.0.0.1" 
      port="42424" 
  />
</configuration>

Los valores anteriores se usan para configurar ASP.NET estado de sesión. Echemos un vistazo a cada uno con más detalle y trataremos los distintos usos después.

  • Mode. La configuración de modo admite tres opciones: inproc, sqlserver y stateserver. Como se indicó anteriormente, ASP.NET admite dos modos: en proceso y fuera del proceso. También hay dos opciones para la administración de estado fuera de proceso: basada en memoria (stateserver) y SQL Server (sqlserver). En breve analizaremos la implementación de estas opciones.
  • Cookieless. La opción sin cookies para ASP.NET se configura con esta configuración booleana sencilla.
  • Tiempo de espera. Esta opción controla el período de tiempo que una sesión se considera válida. El tiempo de espera de la sesión es un valor deslizante; en cada solicitud, el período de tiempo de espera se establece en la hora actual más el valor de tiempo de espera.
  • Sqlconnectionstring. Sqlconnectionstring identifica la cadena de conexión de la base de datos que asigna un nombre a la base de datos utilizada para el modo sqlserver.
  • Servidor. En el servidor de estado del modo fuera de proceso, asigna un nombre al servidor que ejecuta el servicio NT Windows necesario: ASPState.
  • Puerto La configuración de puerto, que acompaña a la configuración del servidor, identifica el número de puerto que corresponde a la configuración del servidor para el servidor de estado del modo.

Aplicación de estado de sesión de ejemplo

Antes de usar el estado de sesión, necesitamos una aplicación con la que probarlo. A continuación se muestra el código de una aplicación Visual Basic ® sencilla que escribe en y lee desde el estado de sesión, SessionState.aspx:

<Script runat=server>
  Sub Session_Add(sender As Object, e As EventArgs)
     Session("MySession") = text1.Value
     span1.InnerHtml = "Session data updated! <P>
                        Your session contains: <font color=red>" +
                        Session("MySession").ToString() + "</font>"
  End Sub

  Sub CheckSession(sender As Object, e As EventArgs)
    If (Session("MySession") = Isnull) Then
      span1.InnerHtml = "NOTHING, SESSION DATA LOST!"
    Else
      span1.InnerHtml = "Your session contains: 
                         <font color=red>" +             
                         Session("MySession").ToString() + "</font>"
    End If
  End Sub
</Script>

<form runat=server>
  <input id=text1 type=text runat=server>
  <input type=submit runat=server 
              OnServerClick="Session_Add" Value="Add to Session State">
  <input type=submit runat=server 
              OnServerClick="CheckSession" Value="View Session State">
</form>
<hr size=1>
<font size=6><span id=span1 runat=server/></font>

Esta página simple enruta dos eventos del lado servidor para los botones Agregar y Ver , y simplemente establece el estado de sesión en el valor del cuadro de texto.

Hay cuatro opciones de configuración generales que podemos examinar con más detalle: modo en proceso, modo fuera de proceso, modo SQL Server y Sin cookies.

Modo en proceso

El modo en proceso simplemente significa usar ASP.NET estado de sesión de forma similar al estado de sesión DE ASP clásico. Es decir, el estado de sesión se administra en proceso y, si el proceso se vuelve a recorrer, se pierde el estado. Dada la nueva configuración que ASP.NET proporciona, es posible que se pregunte por qué usaría este modo. El razonamiento es bastante sencillo: rendimiento. El rendimiento del estado de sesión, por ejemplo, el tiempo que se tarda en leer y escribir en el diccionario de estado de sesión, será mucho más rápido cuando la memoria leída hacia y desde está en proceso, ya que las llamadas entre procesos agregan sobrecarga cuando los datos se serializan hacia atrás y hacia adelante o posiblemente se leen desde SQL Server.

El modo en proceso es la configuración predeterminada para ASP.NET. Cuando se usa esta configuración, la única configuración de session config.web usada es cookieless y timeout.

Si llamamos a SessionState.aspx, establezca un valor de estado de sesión y detenga e inicie el proceso de ASP.NET (iisreset), se perderá el valor establecido antes de que se haya ciclo del proceso.

Modo fuera de proceso

Incluido con el SDK de .NET es un servicio nt de Windows ®: ASPState. Este servicio Windows es lo que ASP.NET usa para la administración de estado de sesión fuera de proceso. Para usar este administrador de estado, primero debe iniciar el servicio. Para iniciar el servicio, abra un símbolo del sistema y escriba:

net start aspstate

Lo que verá es:

Figura 1. Inicio del servicio WINDOWS NT ASPState en el símbolo del sistema

En este momento, el Windows SERVICIO NT ASPState se ha iniciado y está disponible para ASP.NET. A continuación, es necesario configurar ASP.NET para aprovechar este servicio. Para ello, es necesario configurar config.web:

<configuration>
  <sessionstate 
      mode="stateserver"
      cookieless="false" 
      timeout="20" 
      sqlconnectionstring="data source=127.0.0.1;user id=<user id>;password=<password>"
      server="127.0.0.1" 
      port="42424" 
  />
</configuration>

Solo hemos cambiado de inproc modo a stateserver mode. Esta configuración indica a ASP.NET que busque el servicio de estado ASP en el servidor especificado en la server configuración y port , en este caso, el servidor local.

Ahora podemos llamar a SessionState.aspx, establecer un valor de estado de sesión, detener e iniciar el proceso de IIS (iisreset) y seguir teniendo acceso a los valores de nuestro estado actual.

modo de SQL Server

La opción de modo SQL Server es similar a la del servicio NT de Windows, salvo que la información persiste en SQL Server en lugar de almacenarse en memoria.

Para usar SQL Server como almacén de estado de sesión, primero debemos crear las tablas y procedimientos almacenados necesarios que ASP.NET buscarán en el SQL Server identificado. El SDK de .NET nos proporciona un script de SQL (state.sql) para hacerlo.

state.sql

El archivo state.sql contiene los comandos SQL usados para crear la base de datos ASPState. Este script crea dos tablas y varios procedimientos almacenados. ASP.NET usa las tablas y los procedimientos para almacenar datos en SQL Server. Recomiendo leer state.sql para obtener más información sobre lo que está haciendo.

El archivo state.sql se puede encontrar en [unidad del sistema]\winnt\Microsoft.NET\Framework\[versión]\

Aplicación del script state.sql

Para aplicar el script state.sql, use la herramienta de línea de comandos SQL Server proporciona: osql.exe. Con un usuario de SQL equivalente sa, se usa la sintaxis siguiente:

osql –S [server name] –U [user] –P [password] <state.sql

Nota: Se instala una versión ligera de SQL Server cuando se instala el SDK de .NET.

Esto es lo que debería ver:

Ilustración 2. Uso de la herramienta de línea de comandos SQL Server para aplicar el script state.sql

Después de ejecutar osql, inicie y detenga SQL Server; parte de lo que state.sql agregó fueron algunos procedimientos almacenados de inicio que deben ejecutarse. A continuación, modifique los valores de configuración para establecer el modo sqlserver en y modifique para sqlconnectionstring identificar el SQL Server adecuado que sirve a la base de datos ASPState. Por ejemplo:

<configuration>
  <sessionstate 
      mode="sqlserver"
      cookieless="false" 
      timeout="20" 
      sqlconnectionstring="data source=MySqlServer;
                           user id=ASPState;
                           password=1Gr8State"
      server="127.0.0.1" 
      port="42424" 
  />
</configuration>

De nuevo, al igual que el administrador de estado del servicio NT de Windows, ahora podemos llamar a SessionState.aspx, establecer un valor de estado de sesión, detener e iniciar el proceso de IIS (iisreset) y seguir teniendo acceso a los valores de nuestro estado actual. De hecho, podríamos agrupar los servidores de SQL de forma que, si una SQL Server no estuviera disponible, otro servidor que replicaba sus datos podría tener su lugar. Esto proporciona un nivel de confiabilidad que no estaba disponible en ASP.

Estado sin cookies

La última característica nueva que podemos configurar para ASP.NET estado de sesión es el estado de sesión sin cookies. Básicamente, esta característica permite a los sitios cuyos clientes decidan no usar cookies para aprovechar ASP.NET estado de sesión.

Esto se hace modificando la dirección URL con un identificador que identifica de forma única la sesión:

https://localhost/(lit3py55t21z5v55vlm25s55)/Application/SessionState.aspx

ASP.NET modificará los vínculos relativos que se encuentran en la página e insertará este identificador. Por lo tanto, siempre y cuando el usuario siga la ruta de acceso de los vínculos que proporciona el sitio, se puede mantener el estado de sesión. Sin embargo, si el usuario final vuelve a escribir la dirección URL, es probable que se pierda la instancia de estado de sesión.

El Kit de recursos de IIS 4.0 proporcionó una característica similar. Se implementó como un filtro ISAPI que podría modificar la secuencia de bytes entrante y saliente para escribir y leer la información necesaria. La diferencia entre esta y la característica ASP.NET es el esfuerzo necesario para usar la característica. En ASP.NET, es simplemente cuestión de voltear un valor booleano en el archivo config.web:

<configuration>
  <sessionstate 
      mode="stateserver"
      cookieless="true" 
      timeout="20" 
      sqlconnectionstring="data source=127.0.0.1;user id=<user id>;password=<password>"
      server="127.0.0.1" 
      port="42424" 
  />
</configuration>

Una vez establecido cookieless en true, ASP.NET realizará el trabajo necesario para habilitar el estado de sesión sin cookies. Tenga en cuenta también que todos los modos son compatibles con las sesiones sin cookies.

Consideraciones de rendimiento y confiabilidad

Merece la pena mencionar brevemente algunos de los problemas de rendimiento y confiabilidad que debe tener en cuenta al usar ASP.NET modos de estado de sesión.

  • En proceso. En proceso funcionará mejor porque la memoria de estado de sesión se mantiene dentro del proceso de ASP.NET. En el caso de las aplicaciones web hospedadas en un solo servidor, se garantiza que las aplicaciones en las que se garantiza que el usuario se vuelva a dirigir al servidor correcto o cuando los datos de estado de sesión no sean críticos (en el sentido de que se pueden volver a construir o volver a rellenar), este es el modo que se debe elegir.
  • Fuera del proceso. Este modo se usa mejor cuando el rendimiento es importante, pero no se puede garantizar el servidor desde el que un usuario solicitará una aplicación. Con el modo fuera de proceso, obtiene el rendimiento de la lectura de la memoria y la confiabilidad de un proceso independiente que administra el estado de todos los servidores.
  • SQL Server. Este modo se usa mejor cuando la confiabilidad de los datos es fundamental para la estabilidad de la aplicación, ya que la base de datos se puede agrupar en clústeres para escenarios de error. El rendimiento no es tan rápido como fuera del proceso, pero el equilibrio es el mayor nivel de confiabilidad.

Factorbilidad

Lo que no hemos llegado a tratar en este artículo, y algo que veremos en los artículos futuros es la factorización de ASP.NET. Básicamente, esta es la capacidad de ampliar o reemplazar características de ASP.NET, como el estado de sesión. Si un tercero proporciona un administrador de estado de sesión extendido que almacena los datos de sesión en un directorio de Protocolo ligero de acceso a directorios (LDAP), como un directorio LDAP de Netscape, se puede reemplazar la implementación predeterminada del estado de sesión ASP.NET.

Resumen

Como puede ver, ASP.NET estado de sesión es bastante diferente del estado de sesión de ASP. La nueva funcionalidad del estado de sesión que no está enlazada al proceso de ASP.NET significa que los desarrolladores pueden empezar a usar el estado de sesión en entornos de granja de servidores sin preocuparse de si el cliente llega a través de un servidor proxy. Además, con la funcionalidad de estado sin cookies, es incluso más fácil usar el estado de sesión y garantizar que todos los clientes puedan aprovechar la característica de estado de sesión.

En el siguiente artículo veremos la nueva característica de seguimiento en ASP.NET.

Rob Howard es administrador de programas para ASP.NET en el equipo de .NET Frameworks. Pasa cualquier tiempo libre que tenga con su familia o pescando en el este de Washington.