Comprender el estado de la sesión de asp.net
Autor:Eve Cole
Fecha de actualización:2009-07-01 16:44:49
1. Funciones del estado de sesión
HTTP es un protocolo sin estado, por lo que no indica automáticamente si una secuencia de solicitudes provienen todas del mismo cliente, o incluso si una sola instancia del navegador todavía está viendo activamente una página o sitio. Y usando la función de estado de sesión incorporada de ASP.net, podemos usar
1. Identifique y clasifique automáticamente las solicitudes de un único cliente de navegador a una sesión de aplicación lógica en el servidor.
2. Almacene datos de ámbito de sesión en el servidor para utilizarlos en múltiples solicitudes del navegador.
3. Generar eventos de administración de duración de la sesión apropiados (Session_OnStart, Session_OnEnd, etc.) que se puedan manejar en el código de la aplicación.
2. Identificación del estado de la sesión
Al crear una sesión, el servidor genera una identificación separada para cada sesión. El identificador está representado por una cadena SessionID de 120 bits que contiene sólo los caracteres ASCII permitidos en la URL. El valor de SessionID se genera utilizando un algoritmo que garantiza la unicidad y la aleatoriedad. El propósito de garantizar la unicidad es garantizar que las sesiones no entren en conflicto, y el propósito de garantizar la aleatoriedad es garantizar que los usuarios malintencionados no puedan utilizar nuevos SessionID para calcular el número de sesiones existentes. sesiones.
3. Cómo almacenar el estado de la sesión
Hay tres formas de almacenar el estado de la sesión:
1. Modo de estado de sesión en proceso (Inproc): cuando creamos un nuevo programa web, el modo de estado de sesión en proceso se adopta de forma predeterminada. Este también es el modo comúnmente utilizado por todos. En este modo, el estado de la sesión se almacena localmente en el proceso de trabajo de ASP.NET, por lo que, con diferencia, el modo de estado de la sesión en proceso es probablemente la opción de acceso más rápida. Pero cuantos más datos se almacenen en una sesión, más memoria consumirá el servidor web, lo que podría aumentar el riesgo de degradación del rendimiento.
2. Modo de servidor de estado .NET (StateServer): el estado de la sesión se almacena en el proceso remoto (por ejemplo, en el servicio de Windows NT llamado aspnet_state.exe)
3. Modo SQL (SQLServer): el estado de la sesión se almacena en una tabla de base de datos dedicada administrada por SQL Server.
Tanto el modo de servidor de estado .NET como el modo SQL se pueden llamar modo de sesión fuera de proceso. Al almacenar datos, los datos deben serializarse y almacenarse en un repositorio externo. Al leer y datos, los datos deben deserializarse y copiarse. al diccionario de sesión local, por lo que la solicitud resultó en una degradación del rendimiento del 15% (fuera de proceso) al 25% (SQL Server). Tenga en cuenta que esto es sólo una estimación aproximada. Pero en el escenario de almacenamiento fuera de proceso, el estado de la sesión sobrevive más tiempo, lo que hace que la aplicación sea más poderosa porque protege contra fallas de Microsoft® Internet Information Services (IIS) y ASP.NET. Al separar el estado de la sesión de las aplicaciones, también puede ampliar más fácilmente las aplicaciones existentes a las arquitecturas Web Farm y Web Garden. Además, el estado de la sesión se almacena en un proceso externo, lo que esencialmente elimina el riesgo de pérdida periódica de datos debido a bucles de proceso.
4. Configuración del estado de la sesión.
La configuración del estado de la sesión se logra configurando la sección <sessionState> del archivo Web.config. A continuación se presentan los métodos de configuración específicos de los tres estados de sesión.
1. Modo en proceso
El modo en proceso es el modo de estado de sesión predeterminado. Para utilizar el modo en proceso, establezca el atributo de modo del elemento <sessionState> en Inproc.
A continuación se muestra un ejemplo de configuración para el modo en proceso. http://www.downcodes.com
<configuración>
<sistema.web>
<modo de estado de sesión="Inproc"
sin cookies = "falso"
tiempo de espera="20"/>
</estadodesesión>
</system.web>
</configuración>
2. Modo de servidor de estado
Para utilizar un servidor de estado, primero debe asegurarse de que el servicio de estado ASP.NET se esté ejecutando en el servidor remoto utilizado para el almacenamiento de sesiones. Este servicio se instala con ASP.NET y Visual Studio .NET en:
raíz del sistemaMicrosoft.NETFrameworkversionNumberaspnet_state.exe
Luego, en el archivo Web.config de la aplicación, establezca el atributo de modo del elemento <sessionState> en StateServer. Finalmente, establezca la propiedad ConnectionString en tcpip=serverName:portNumber.
El siguiente es un ejemplo de ajustes de configuración para el modo de servidor de estado.
<configuración>
<sistema.web>
<modo de estado de sesión="Servidor de estado"
stateConnectionString="tcpip=servidor de datos:42424"
sin cookies = "falso"
tiempo de espera="20"/>
</estadodesesión>
</system.web>
3. Modo de servidor SQL
Para usar SQL Server, primero ejecute InstallSqlState.sql o InstallPersistSqlState.sql en la computadora con SQL Server donde se almacenará el estado de la sesión. Ambos scripts crean una base de datos llamada ASPState, que contiene varios procedimientos almacenados.
La diferencia entre los dos scripts es dónde se colocan las tablas ASPStateTempApplications y ASPStateTempSessions. El script InstallSqlState.sql agrega estas tablas a la base de datos TempDB, que perderá datos cuando se reinicie la computadora. En cambio, el script InstallPersistSqlState.sql agrega estas tablas a la base de datos ASPState, lo que permite conservar los datos de la sesión después de reiniciar la computadora.
De forma predeterminada, ambos archivos de script se instalan en la siguiente ubicación:
raíz del sistemaMicrosoft.NETFrameworknúmero de versión
Luego, en el archivo Web.config de la aplicación, establezca el atributo de modo del elemento <sessionState> en SQLServer. Finalmente, establezca la propiedad sqlConnectionString en Seguridad integrada=SSPI;fuente de datos=nombredelservidor;.
A continuación se muestra un ejemplo de configuración para el modo SQL Server.
<configuración>
<sistema.web>
<modo de estado de sesión="SQLServer"
sqlConnectionString="Seguridad integrada=SSPI;fuente de datos=servidor de datos;"
sin cookies = "falso"
tiempo de espera="20"/>
</estadodesesión>
</system.web>
</configuración>
En el modo SQL Server, el estado de la sesión también se puede configurar para que funcione en un clúster de conmutación por error. Un clúster de conmutación por error son dos o más servidores web redundantes idénticos que almacenan datos de sesión en una base de datos de SQL Server en una computadora separada. Si un servidor web falla, otro servidor del clúster se hace cargo de su trabajo y atiende las solicitudes sin perder datos de la sesión.
Para configurar el clúster de conmutación por error, establezca el elemento <machinekey> en el archivo Web.config del servidor web en el mismo valor.
Luego configure la cadena de conexión SQL del servidor web para que apunte a la base de datos de SQL Server en su computadora donde se almacenan los datos de la sesión.
5. Acceso al estado de la sesión.
Puede acceder al estado de la sesión directamente a través de la colección Session. Para compatibilidad con versiones anteriores de ASP, el acceso al estado de la sesión también se puede lograr a través de la propiedad Session.Contents en el objeto de la aplicación.
El siguiente ejemplo muestra cómo escribir dos valores en la colección Session en la primera página web y luego leer la colección Session en la segunda página web. Nota: Aquí se omiten los códigos de página.
La primera página web escribe el valor en la colección Session.
nombre tenue como cadena = "a"
ID tenue como número entero = "1"
sesión("nombre") = nombre
sesión("identificación") = identificación
La segunda página web obtiene el valor de la colección Session.
nombre tenue como cadena = sesión ("nombre")
ID tenue como número entero = sesión ("id")
'Obtiene la cantidad de elementos en la colección de estado de sesión
tenue i como número entero = sesión.count
Tenga en cuenta que en el modo en proceso, no se produce ninguna serialización ni deserialización real, por lo que los objetos se almacenan en estado de sesión como instancias activas de sus respectivas clases.
En el modo de sesión fuera de proceso, debido a que se utilizan serialización y deserialización, el tipo de datos debe convertirse según la situación.
Si está serializando un valor de fecha, la fecha debe ser del tipo Int64.
6. Eventos de gestión de la duración de la sesión
Hay dos eventos de administración de duración de la sesión, el evento Session_OnStart y el evento Session_OnEnd. Puede configurarlos en el archivo Global.asax.VB.
1. evento Session_OnStart
Cuando un único cliente de navegador se conecta al servidor, se activa el evento Session_OnStart, que marca el comienzo de la sesión. Este evento ya no se activará durante la navegación posterior a menos que la sesión expire o se abandone. El evento Session_OnStart es el mejor momento para configurar las variables de sesión porque se configuran antes de acceder a cualquier página.
Ejemplo: el siguiente ejemplo es un código de evento Session_OnStart de uso común para contar la cantidad de personas en línea:
Sub Session_Start (remitente ByVal como objeto, ByVal y como EventArgs)
'Cuando ocurra un evento, agregue 1 al número de usuarios en línea
Aplicación("cuenta de usuarios") = Aplicación("cuenta de usuarios") + 1
Subtítulo final
2. Evento Session_OnEnd
El evento Session_OnEnd ocurre cuando una sesión se abandona o se agota el tiempo de espera y marca el final del evento. Pero tenga en cuenta que este evento solo se admite en el modo InProc. Puede especificar el período de tiempo de espera a través del atributo de tiempo de espera de la sección <sessionState> del archivo Web.config si el usuario se encuentra dentro del período de tiempo de espera (en minutos, el valor predeterminado es 20 minutos).
reloj) sin actualizar o solicitar la página web, se dará por finalizada la sesión. Puede utilizar el evento Session_OnEnd para realizar un trabajo de limpieza.
Ejemplo: el siguiente ejemplo es un código de evento Session_OnEnd de uso común para contar la cantidad de personas en línea:
Sub Session_End(ByVal remitente como objeto, ByVal y como EventArgs)
Aplicación("cuenta de usuarios") = Aplicación("cuenta de usuarios") - 1
Subtítulo final