Administración del estado Índice Descripción 1 Lección: administración del estado 2 Lección: variables de aplicación y de sesión 17 Lección: cookies y sesiones que no utilizan cookies 29
Administración del estado 1 Descripción Administración del estado Variables de aplicación y de sesión Cookies y sesiones que no utilizan cookies Objetivos Microsoft ASP.NET permite administrar el estado de una aplicación Web. El estado es la capacidad de una aplicación Web de conservar la información del usuario. En este módulo, estudiaremos cómo administrar el estado de una aplicación Web ASP.NET. En este módulo, aprenderemos a: Describir la administración del estado y las distintas opciones disponibles para administrar el estado en una aplicación Web ASP.NET. Utilizar variables de aplicación y de sesión para administrar el estado en aplicaciones Web ASP.NET. Utilizar cookies y sesiones que no utilizan cookies para administrar el estado en aplicaciones Web ASP.NET.
2 Administración del estado Lección: administración del estado Qué es la administración del estado? Tipos de administración del estado Administración del estado en el lado del servidor Administración del estado en el lado del cliente El archivo Global.asax Objetivos de la lección La conexión que se establece entre un usuario (el equipo cliente) y un servidor Web se denomina sesión. Las sesiones pueden abarcar múltiples páginas Web y su seguimiento se realiza mediante la administración del estado. La administración del estado es el proceso por el cual mantenemos la misma información a través de múltiples peticiones para las mismas o distintas páginas Web. En esta lección, empezaremos a conocer en detalle qué es la administración del estado y por qué es importante administrar el estado. Estudiaremos la administración del estado en el lado del servidor y la administración del estado en el lado del cliente. También estudiaremos el archivo global.asax. En esta lección, aprenderemos a: Describir la administración del estado. Identificar los distintos tipos de opciones de administración del estado. Describir la administración del estado en el lado del servidor. Describir la administración del estado en el lado del cliente. Describir los distintos eventos que controla el archivo global.asax.
Administración del estado 3 Qué es la administración del estado? Sin administración del estado Con administración del estado Login.aspx Introduzca su información de inicio de sesión: Nombre John Apellido Chen Enviar Enviar Greetings.aspx Servidor Web Login.aspx Introduzca su información de inicio de sesión: Nombre John Apellido Chen Enviar Enviar Greetings.aspx Servidor Web Hola Hola John Chen He olvidado quién eres!! Administración del estado Ejemplo Al igual que las tecnologías basadas en Hypertext Transfer Protocol (HTTP), los formularios Web Forms no tienen estado, lo que significa que no indican automáticamente si las peticiones de una secuencia son todas del mismo cliente ni si una única instancia de navegador sigue visualizando de forma activa una página Web o un sitio Web. Además, las páginas Web se destruyen y vuelven a crearse a continuación con cada nueva petición al servidor Web; por tanto, la información de las páginas no existe más allá del ciclo de vida de una única página. ASP.NET ofrece una administración del estado que guarda información en el servidor entre páginas, que ayuda a mantener la continuidad de la información del usuario (estado) durante una visita a un sitio Web. Si se mantiene el estado entre páginas, la información suministrada originalmente por los usuarios puede ser reutilizada; por ello, los usuarios no necesitan volver a introducir la misma información varias veces cada vez que se envía una página de retorno al servidor. Por ejemplo, en la ilustración anterior, el usuario, John Chen, introduce su nombre en el formulario login.aspx. Después de introducir sus datos personales, esa información se envía al servidor y se muestra la página siguiente, el formulario greetings.aspx. Sin administración del estado, la información que el usuario ha introducido en la primera página se ha perdido. Sin embargo, si se utiliza administración del estado en la aplicación Web, puede mantenerse el estado a través de varias páginas Web. Por tanto, cuando la información personal del usuario se envía al servidor, la segunda página, el formulario greetings.aspx, da la bienvenida al usuario con su nombre, John
4 Administración del estado Chen, que el usuario introdujo en el formulario login.aspx, la primera página de la aplicación Web.
Administración del estado 5 Tipos de administración del estado Administración n del estado en el lado del servidor Estado de la aplicación La información está disponible para todos los usuarios de una aplicación Web Estado de sesión La información está disponible únicamente para el usuario de una sesión específica Base de datos En algunos casos, se utiliza el soporte de base de datos para mantener el estado en el sitio Web Administración n del estado en el lado del cliente Cookies Archivo de texto que almacena información para mantener el estado Propiedad ViewState Conserva valores entre múltiples peticiones para la misma página Cadenas de consulta Información añadida al final de una URL Administración del estado en el lado del cliente y en el lado del servidor Lado servidor ASP.NET proporciona dos tipos de administración del estado que pueden utilizarse para mantener el estado entre envíos y respuestas al servidor. La elección de uno de los dos tipos de administración del estado disponibles en ASP.NET depende principalmente de la naturaleza de la aplicación Web. Los dos tipos de administración del estado son: Lado servidor Las opciones de la administración del estado en el lado del servidor utilizan recursos del servidor para almacenar la información del estado. La seguridad de estas opciones es mayor que en el lado del cliente. Lado cliente La administración del estado en el lado del cliente no utiliza recursos del servidor para almacenar la información del estado. Las opciones en el lado del cliente tienden a tener seguridad mínima, pero ofrecen un rápido rendimiento del servidor porque no existe demanda en el servidor para mantener el estado. La administración del estado en el lado del servidor contiene diferentes opciones a escoger, incluyendo: Estado de aplicación En el estado de aplicación, la información está disponible para todos los usuarios de una aplicación Web; por ejemplo, almacenar el número de visitantes a una aplicación Web. Estado de sesión
6 Administración del estado En el estado de sesión, la información está disponible únicamente para un usuario de una sesión específica de una aplicación Web; por ejemplo, almacenar el esquema de colores preferido de un usuario.
Administración del estado 7 Base de datos Microsoft SQL Server o un servidor de estado Otra opción de la administración del estado en el lado del servidor es utilizar la tecnología de bases de datos. Podemos utilizar una base de datos SQL Server o un servidor de estado para almacenar información específica del usuario cuando el almacén de información es de gran tamaño. La base de datos SQL Server o un servidor de estado pueden utilizarse conjuntamente con el estado de sesión y cookies. El objeto Cache También podemos utilizar el objeto Cache para administrar el estado a nivel de aplicación. Lado cliente La administración del estado en el lado del cliente también ofrece distintas opciones para mantener el estado. Estas opciones incluyen: Cookies Una cookie es un archivo de texto que puede utilizarse para almacenar pequeñas cantidades de información necesarias para mantener el estado. La propiedad ViewState Los formularios Web Forms proporcionan la propiedad ViewState como una estructura incluida para conservar automáticamente valores entre múltiples peticiones a la misma página. La propiedad ViewState se mantiene como un campo oculto en la página. Cadenas de consulta Una cadena de consulta es información que se añade al final de una URL (Uniform Resource Locator). Un ejemplo típico podría ser el siguiente: http://www.contoso.com/listwidgets.aspx?category=basic&price=100 En la ruta URL anterior, la cadena de consulta se inicia con un signo de interrogación (?) e incluye dos pares atributo-valor, categoría y precio. Nota Este módulo cubre información que pertenece únicamente a cookies. Para más información sobre ViewState y cadenas de consulta, consultar la documentación de Microsoft Visual Studio.NET.
8 Administración del estado Administración del estado en el lado del servidor El estado de la aplicación es un mecanismo de almacenamiento global accesible desde todas las páginas de la aplicación Web El estado de sesión está limitado a la sesión de explorador actual Los valores se conservan mediante el uso de variables de aplicación y de sesión Escalabilidad La sesión ASP.NET se identifica con la cadena SessionID Equipo cliente SessionID Servidor Web Variables de aplicación y de sesión Estado de aplicación Variables de aplicación Estado de sesión ASP.NET ofrece varias opciones para administrar el estado en el lado del servidor. Los estados de aplicación y de sesión son dos de estas opciones. Esta sección trata de los estados de aplicación y de sesión en mayor detalle. ASP.NET proporciona el estado de aplicación utilizando una instancia de la clase HttpApplicationState para cada aplicación Web activa. El estado de aplicación es un mecanismo de almacenamiento global al que se puede acceder desde todas las páginas de la aplicación Web, y por tanto es útil para almacenar información del usuario que debe preservarse entre transferencias al servidor y viajes entre páginas. El estado de la aplicación es una estructura de diccionario clave-valor que se crea en cada petición a una URL específica. Podemos agregar la información específica de la aplicación a esta estructura para almacenarla entre peticiones de páginas. Después de agregar la información específica de aplicación al estado de la aplicación, el servidor la gestiona. ASP.NET proporciona las variables de aplicación que mantienen el estado de aplicación. Los datos ideales para insertar en variables de aplicación son los datos compartidos por múltiples sesiones y que no cambian a menudo. ASP.NET proporciona estado de sesión utilizando una instancia de la clase HttpSessionState para cada sesión de aplicación Web activa. El estado de sesión es similar al estado de aplicación, salvo en que está limitado a la sesión actual del navegador. Si distintos usuarios están utilizando una aplicación Web, cada usuario tendrá un estado de sesión distinto. Además, si el mismo usuario abandona la aplicación Web y regresa más tarde, ese usuario también tendrá un estado de sesión distinto al que tenía antes.
Administración del estado 9 El estado de sesión está almacenado como una estructura de diccionario clavevalor que se utiliza par almacenar información específica de la sesión que debe mantenerse entre transferencias de páginas al servidor y entre peticiones de páginas. Tras agregar la información específica de la aplicación al estado de sesión, el servidor la gestiona. Podemos configurar ASP.NET para automáticamente serialice y almacene la información de sesión en una base de datos SQL Server o en un servidor de estado. Variables de sesión ASP.NET proporciona las variables de sesión necesarias para mantener el estado de sesión. Los datos ideales para almacenar en las variables de estado de sesión son datos fugaces o confidenciales, específicos de una sesión individual. Nota Los estados de aplicación y de sesión se implementan como una tabla hash, y almacenan datos basándose en combinaciones de pares clave/valor. Una tabla hash es similar al concepto de un objeto dictionary. Escalabilidad Identificar y hacer el seguimiento de una sesión Con ASP.NET, el estado de sesión puede utilizarse tanto en configuraciones de múltiples equipos como de múltiples procesos; optimizando por tanto los escenarios de escalabilidad de una aplicación Web. Cada sesión de aplicación Web activa está identificada y monitorizada utilizando una cadena SessionID de 120 bits que únicamente contiene los caracteres ASCII permitidos en las URLs. Las cadenas SessionID están comunicadas a través de peticiones cliente-servidor, mediante una cookie HTTP o mediante una URL modificada, con la cadena SessionID embebida, denominadas normalmente SessionID sin cookies, dependiendo de la configuración de la aplicación Web. La administración del estado en el lado del servidor requiere que una cookie almacene la SessionID en el equipo cliente. Debido a que la vida de una SessionID es muy breve, sólo lo que dura una sesión, el mecanismo que ASP.NET utiliza para almacenar la información de sesión, en una base de datos SQL Server o en un servidor de estado, también se utiliza para permitir que la aplicación sea escalable, pero no para un almacenamiento a largo plazo. Si deseamos implementar el almacenamiento a largo plazo de la información de sesión del usuario, debemos requerir a los usuarios que introduzcan su información personal, y deberemos implementar nuestra propia solución de almacenamiento utilizando una base de datos que almacene permanentemente la información personal de usuarios registrados.
10 Administración del estado Administración del estado en el lado del cliente Utiliza cookies para mantener el estado Cookies persistentes Cookies temporales/no persistentes Menos fiable que las opciones de administración del estado en el lado del servidor El usuario puede eliminar cookies Menos seguro que las opciones de administración del estado en el lado del servidor Cantidad de información limitada Restricciones en el lado del cliente en el tamaño de los archivos Servidor Web Equipo cliente Cookies Cookies Tipos de cookies La mayoría de aplicaciones Web utilizan cookies para la administración del estado en el lado del cliente. Una cookie es una pequeña cantidad de datos que se almacena en un archivo de texto en el sistema de archivos del equipo cliente o en memoria en la sesión cliente-navegador. Una cookie contiene información específica de la página que el servidor envía al cliente, junto con la salida de la página. Podemos utilizar cookies para almacenar información sobre un determinado cliente, sesión o aplicación. Las cookies se almacenan en el equipo cliente, y cuando el navegador solicita una página, envía la información de la cookie, junto con la información solicitada. El servidor está autorizado a leer la cookie y extraer su valor. Cada cookie contiene la información del dominio que invocó la cookie. Podemos tener varias cookies invocadas para un dominio. Los dos tipos de cookies son: Temporales Las cookies temporales, también denominadas cookies de sesión o no persistentes, existen únicamente en la memoria del navegador. Cuando el éste se apaga, las cookies temporales que se han añadido se pierden. Persistentes Las cookies persistentes son similares a las cookies temporales, excepto en que las cookies persistentes tienen un periodo de expiración fijo. Cuando un navegador solicita una página que crea una cookie persistente, éste guarda esa cookie en el disco duro del usuario. Podemos crear una cookie persistente que dure meses, o incluso años, en el equipo cliente. Con Microsoft Internet Explorer, las cookies persistentes se almacenan en un
Administración del estado 11 archivo denominado nombreusuario@nombredominio.txt, que se crea en el disco duro del cliente.
12 Administración del estado Vencimiento Seguridad Información limitada Las cookies pueden expirar cuando finaliza la sesión del explorador (cookies temporales), o pueden existir indefinidamente en el equipo cliente, dependiendo de las reglas de expiración del cliente (cookies persistentes). Los usuarios también pueden decidir eliminar cookies de su equipo antes de que éstas expiren. Por tanto, no existe garantía de que una cookie persistente permanecerá en el equipo de un usuario durante el periodo de tiempo especificado. Las cookies son menos seguras si las comparamos con las opciones de administración del estado en el lado del servidor. Las cookies también están sujetas a la manipulación. Lo usuarios pueden manipular cookies en su equipo, lo que puede representar potencialmente un compromiso de seguridad o puede hacer que la aplicación que depende de la cookie pueda fallar. También existe un límite sobre cuánta información puede almacenarse en una cookie ya que los equipos cliente tienen restricciones en el tamaño de los archivos. Además, cada cookie individual puede contener una cantidad limitada de información, no más de 4 kilobytes (KB).
Administración del estado 13 El archivo Global.asax Sólo un archivo Global.asax por aplicación Web Almacenado en la raíz del directorio virtual de la aplicación Web Utilizado para gestionar eventos de aplicación y de sesión El archivo Global.asax es opcional El archivo global.asax es un archivo declarativo que se utiliza para la gestión de eventos mientras la aplicación Web se está ejecutando. Algunas de las características del archivo global.asax son: Por cada aplicación Web ASP.NET se soporta un archivo global.asax. El archivo global.asax se almacena en la raíz del directorio virtual de la aplicación Web. El archivo global.asax puede gestionar eventos de aplicación y de sesión (inicio y final) que pueden utilizarse para inicializar variables de aplicación y de sesión. El archivo global.asax es opcional. Si no definimos el archivo, el marco de trabajo de las páginas ASP.NET asume que no hemos definido ningún controlador de eventos de aplicación o sesión.
14 Administración del estado El archivo global.asax (continuación) Cliente Petición Respuesta Servidor Web ASP.NET Application_BeginRequest Application_AuthenticateRequest IIS ASP.NET HTTP Runtime Application_AuthorizeRequest Application_ResolveRequestCache Application_AquireRequestState Application_PreRequestHandlerExecute Application_EndRequest Application_UpdateRequestCache Application_ReleaseRequestState Application_PostRequestHandlerExecute Ejecución de la página Categorías de eventos Eventos invocados cuando se solicita una página El archivo global.asax es un archivo declarativo que se utiliza para gestionar eventos mientras la aplicación Web se está ejecutando. El archivo global.asax soporta tres categorías de eventos: Eventos que se invocan cuando se solicita una página. Eventos que se invocan cuando se envía la página solicitada. Eventos de aplicación condicionales. La siguiente tabla lista los eventos que se invocan cuando se solicita una página. Nombre del evento Descripción Application_BeginRequest Application_AuthenticateRequest Application_AuthorizeRequest Application_ResolveRequestCache Application_AcquireRequestState Este evento se invoca cada vez que se recibe una nueva petición. Este evento indica que la petición está preparada para ser autenticada. Este evento indica que la petición está preparada para ser autorizada. Este evento es utilizado por el módulo de la caché de salida para detener el procesamiento de peticiones que han sido almacenadas en caché. Este evento indica que debería obtenerse el estado para cada petición.
Administración del estado 15 Application_PreRequestHandlerExecute Este evento indica que el gestor de peticiones está a punto de ejecutarse.
16 Administración del estado Eventos invocados cuando se envía la página solicitada Global.asax también incluye eventos invocados cuando la página solicitada se envía de vuelta al cliente. La siguiente tabla lista estos eventos. Nombre del evento Descripción Application_PostRequestHandlerExecute Application_ReleaseRequestState Application_UpdateRequestCache Application_EndRequest Este evento es el primero disponible después de que el controlador, como una página ASP.NET o un servicio Web, haya finalizado su trabajo. Este evento se invoca cuando el estado de la petición debe almacenarse, porque la aplicación Web ASP.NET finaliza con él. Este evento indica que el procesamiento de código ha finalizado y que el archivo está preparado para ser agregado a la caché de ASP.NET. Este evento es el último evento que se invoca cuando finaliza la aplicación Web ASP.NET. Eventos de aplicación condicionales Los eventos de aplicación condicionales son eventos que pueden o no ser lanzados durante le procesamiento de una petición. La siguiente tabla muestra algunos de los eventos de aplicación condicionales más habituales. Nombre del evento Application_Start Application_End Session_Start Session_End Application_Error Descripción Este evento se invoca cuando se inicia una aplicación Web ASP.NET. Este evento es otro evento de ocurrencia única. Es el evento recíproco de Application_Start; se invoca cuando se cierra la aplicación Web ASP.NET. Este evento se invoca cuando se inicia la Session de un usuario en una aplicación Web ASP.NET. Este evento es un evento reciproco de Session_Start; este evento se invoca cuando finaliza la sesión de un usuario. Este evento se invoca cuando ocurre un error no controlado en una aplicación Web ASP.NET.
Lección: variables de aplicación y de sesión Administración del estado 17 Inicializar variables de aplicación y de sesión Utilizar variables de aplicación y de sesión Demostración: uso de las variables de sesión Duración de las variables de aplicación y de sesión Almacenamiento escalable de variables de aplicación y de sesión Almacenar las variables de aplicación y de sesión en una base de datos Objetivos de la lección Podemos utilizar las variables de aplicación y de sesión para compartir información entre las páginas de una aplicación Web ASP.NET. En esta lección, estudiaremos cómo inicializar y utilizar las variables de aplicación y de sesión. También estudiaremos cómo especificar la duración de las variables de aplicación y de sesión y cómo afectan al almacenamiento escalable. Finalmente, estudiaremos cómo almacenar las variables de aplicación y de sesión en una base de datos. En esta lección, aprenderemos a: Inicializar variables de aplicación y de sesión. Establecer y leer variables de aplicación y de sesión. Modificar la duración de la variable de aplicación y de sesión. Describir los métodos en el proceso y fuera del proceso utilizados para almacenar el estado de sesión. Almacenar variables de aplicación y de sesión en una base de datos.
18 Administración del estado Inicializar variables de aplicación y de sesión Las variables se inicializan en Global.asax El objeto Application comparte información entre todos los usuarios de una aplicación Web Sub Sub Application_Start(s As As Object,e Object,e As As EventArgs) EventArgs) Application("NumberofVisitors") = 0 End End Sub Sub protected protected void void Application_Start(Object sender,eventargs e) e) { Application["NumberofVisitors"] = 0; 0; } El objeto Session almacena información para una sesión de usuario concreta Variables de sesión Visual Basic.NET C# Inicializamos las variables de aplicación y de sesión en los procedimientos de eventos Start de los objetos Application y Session del archivo global.asax. Utilizamos el objeto Session para almacenar la información necesaria de una sesión de usuario concreta. Las variables que se almacenan en el objeto Session no se desecharán cuando el usuario viaje por las distintas páginas de la aplicación Web. En lugar de ello, estas variables persistirán durante toda la sesión del usuario. El siguiente código de ejemplo muestra cómo se utilizan las variables de sesión para almacenar el esquema de colores preferido de una determinada sesión de usuario: Sub Session_Start(ByVal Sender As Object, _ ByVal e As EventArgs) Session("BackColor") = "beige" Session("ForeColor") = "black" End Sub protected void Session_Start(Object sender, EventArgs e) { Session["BackColor"] = "beige"; Session["ForeColor"] = "black"; }
Administración del estado 19 Variables de aplicación Visual Basic.NET C# Podemos utilizar el objeto Application para compartir información de estado entre todos los usuarios de una aplicación Web. Cuando el primer usuario de la aplicación Web solicita un archivo.aspx, se crea un objeto Application. El objeto Application se destruye cuando todos los usuarios han abandonado la aplicación Web y, a continuación, se descarga la aplicación Web. Por ejemplo, podríamos almacenar el número total de visitantes de un sitio Web en una variable de nivel de aplicación: Sub Application_Start(ByVal Sender As Object, _ ByVal e As EventArgs) Application("NumberofVisitors") = 0 End Sub protected void Application_Start(Object sender, EventArgs e) { Application["NumberofVisitors"] = 0; }
20 Administración del estado Utilizar variables de aplicación y de sesión Establecer variables de aplicación y sesión Session("BackColor") = "blue" "blue" Application.Lock() Application("NumberOfVisitors") += += 1 Application.UnLock() Session["BackColor"] = "blue"; "blue"; Application.Lock(); Application["NumberOfVisitors"] = (int)application["numberofvisitors"] + 1; 1; Application.UnLock(); Leer variables de aplicación y de sesión strbgcolor = Session("BackColor") lblnbvisitor.text = Application("NumberOfVisitors") strbgcolor = (string)session["backcolor"]; lblnbvisitor.text = Application["NumberOfVisitors"].ToString(); Establecer variables de aplicación y de sesión Para utilizar variables de aplicación y de sesión en ASP.NET, simplemente utilizamos una clave de cadena y establecemos un valor. Para establecer la variable de sesión, debemos proporcionar una clave que identifique el elemento que estamos almacenando, utilizando una instrucción como la siguiente: Session("BackColor") = "blue" La instrucción anterior agrega una clave, denominada BackColor, al estado de sesión con el valor blue. Puede accederse a las variables de aplicación en un entorno de múltiples usuarios; por ello, cuando se actualicen los datos de Application, debemos evitar que otros usuarios o aplicaciones actualicen los datos simultáneamente. ASP.NET proporciona un sencillo conjunto de métodos de bloqueo, Application.Lock() y Application.UnLock(), que pueden utilizarse para evitar el acceso múltiple y simultáneo de la variable de aplicación. El siguiente código muestra el uso de los métodos Application.Lock() y Application.UnLock(): Visual Basic.NET C# Application.Lock() Application("NumberOfVisitors") += 1 Application.UnLock() Application.Lock(); Application["NumberofVisitors"] = (int)application["numberofvisitors"] + 1; Application.UnLock();
Administración del estado 21 Leer variables de aplicación y de sesión Visual Basic.NET C# Para utilizar una variable de sesión o de aplicación en una página ASP.NET, simplemente necesitamos leer el valor del objeto Session o Application: strbgcolor = Session("BackColor") lblnbvisitor.text = Application("NumberOfVisitors") strbgcolor = (string)session["backcolor"]; lblnbvistitor.text = Application["NumberofVisitors"].ToString();
22 Administración del estado Demostración: uso de las variables de sesión Inicializar una variable de sesión (un número) en global.asax Acceder a la variable de sesión desde una página Acceder a la variable de sesión desde otra página y modificarla Volver a acceder a la variable de sesión desde la primera página Visual Basic.NET C# En esta demostración, aprenderemos a utilizar variables de sesión. El código para esta demostración se encuentra en los proyectos Demo12VB y Demo12CS que se pueden encontrar dentro del fichero demos12.zip. Ejecutar la demostración 1. Abrir el proyecto Demo12VB o Demo12CS. 2. Abrir la página de código subyacente de global.asax. 3. Inicializar una variable de sesión, denominada intnumber a 3, agregando el siguiente código al procedimiento de evento Session_Start: Session("intNumber") = 3 Session["intNumber"] = 3; 4. Abrir los archivos UsingSessionVar1.aspx y UsingSessionVar2.aspx. Se recupera la variable de sesión y se muestra en el procedimiento de evento Page_Load. 5. Generar y examinar la página UsingSessionVar1.aspx. Se muestra el valor de la variable de sesión, 3. 6. Hacer clic en Next Page. Se abre la página UsingSessionVar2.aspx, incrementa la variable de sesión en 4, y muestra el nuevo valor, 7. 7. Hacer clic en Previous Page para regresar a UsingSessionVar1.aspx, que muestra el nuevo valor de la variable de sesión.
Administración del estado 23 Duración de la variable de sesión y de aplicación Las variables de sesión tienen una duración establecida tras el último acceso 20 minutos es la duración predeterminada La duración de la sesión puede modificarse en Web.config: <configuration> <system.web> <sessionstate timeout="10" /> </system.web> </configuration> Las variables de aplicación persisten hasta que se provoca el evento Application_End Duración predeterminada de la sesión HTTP es un protocolo sin estado. Un servidor Web no tiene medios para detectar cuando un usuario abandona un sitio Web. En cambio, el servidor Web detecta que ha transcurrido un determinado periodo de tiempo sin que el usuario solicite una página. En ese momento, el servidor Web asume que el usuario ha abandonado el sitio Web y elimina todos los elementos del estado de sesión asociados a ese usuario. De forma predeterminada, el tiempo de una sesión finaliza cuando un usuario no ha solicitado ninguna página durante más de 20 minutos. Si el mismo usuario solicita una página transcurridos 20 minutos, será tratado como un nuevo usuario. Nota Establecer duraciones de sesión más cortas permite al sitio Web ahorrar recursos en el servidor Web. En cambio, si nuestra previsión es que el usuario pase más de 20 minutos en nuestro sitio Web, deberíamos establecer una duración de sesión más larga. Modificar la duración de la sesión Podemos modificar la duración de la sesión en el archivo Web.config. Los archivos Web.config son archivos Extensible Markup Language (XML) estándares y legibles por parte del usuario que podemos abrir y modificar con cualquier editor de texto. Por ejemplo, en el siguiente archivo Web.config, la duración de la sesión está establecida en 10 minutos: <configuration> <system.web> <sessionstate timeout="10" /> </system.web> </configuration>
24 Administración del estado Variable de aplicación Las variables de aplicación persisten hasta que se invoca el evento Application_End. Application_End se invoca inmediatamente antes del final de todas las instancias de la aplicación.
Administración del estado 25 Almacenamiento escalable de variables de aplicación y de sesión y Por defecto, el estado de sesión se administra en proceso (in process) Inconveniente del almacenamiento en proceso: No escalable ASP.NET proporciona almacenamiento fuera del proceso (out of process) del estado de sesión El estado puede almacenarse en una base de datos SQL Server o un servidor de estado Ventajas del almacenamiento fuera del proceso: Escalabilidad Granja Web Servidor de estado -O- Variables de sesión y de aplicación Cliente SQL Variables de sesión y de aplicación Inconveniente del almacenamiento en proceso Fuera de proceso Por defecto, el estado de sesión se administra en proceso (in process). En proceso significa que toda la información que se agrega a un estado de sesión se almacena en el mismo servidor Web que está ejecutando la aplicación Web ASP.NET. Sin embargo, el almacenamiento en proceso del estado de sesión tiene algunos inconvenientes importantes. Uno de los principales inconvenientes del almacenamiento del estado de sesión en proceso es que limita la escalabilidad de nuestro sitio Web. No podemos configurar múltiples servidores para gestionar peticiones. ASP.NET ofrece dos métodos que pueden utilizarse para almacenar estado de sesión fuera de proceso (out of process). Podemos: Administrar el estado de sesión en una base de datos SQL Server. Administrar el estado de sesión en un servidor de estado distinto. Cualquier servidor basado en Microsoft Windows puede ser un servidor de estado. Para almacenar el estado de sesión fuera de proceso, debemos modificar el archivo Web.config para establecer el modo sessionstate con el valor sqlserver o stateserver, y especificar la ubicación del servidor. La opción sqlserver es similar a la opción stateserver, salvo en que en la primera la información persiste en SQL Server en lugar de almacenarse en la memoria del equipo. Ventaja del almacenamiento fuera de proceso La principal ventaja de separar el almacenamiento del estado de sesión de la aplicación Web es que podemos utilizar un servidor de estado externo o un equipo que ejecute SQL Server para almacenar el estado de sesión, haciendo por tanto que la aplicación Web sea escalable. Para conseguir aplicaciones Web
26 Administración del estado ASP.NET escalables, el estado de sesión debe estar compartido por múltiples servidores que soporten el escenario de granja Web. En un escenario de granja Web, múltiples servidores están configurados para gestionar las peticiones de los usuarios y, en consecuencia, éstas pueden ser ruteadas dinámicamente desde un servidor a otro sin perder las variables de aplicación y de sesión. Además, las variables de sesión pueden recuperarse desde cualquier servidor de la granja Web, ya que están almacenadas en un equipo distinto que ejecuta SQL Server o en un servidor de estado.
Administración del estado 27 Almacenar variables de aplicación y de sesión en una base de datos Configurar el estado de sesión en Web.config 11 Modo establecido a sqlserver o stateserver <sessionstate mode="sqlserver" sqlconnectionstring="data source=sqlservername; Integrated security=true" /> A continuación, configurar el servidor SQL Server 22 c:\> OSQL S S SQLServerName E E <InstallSqlState.sql OSQL crea varios procedimientos almacenados y bases de datos temporales para almacenar las variables Configura el estado de sesión en el archivo Web.config de nuestro servidor Web ASP.NET Para almacenar variables de aplicación y de sesión en una base de datos SQL Server o en un servidor de estado, debemos seguir los siguientes pasos: 1. Configurar el estado de sesión en el archivo Web.config del servidor Web. 2. Configurar el servidor SQL Server o el servidor de estado. En el archivo Web.config, debemos modificar la configuración para establecer el atributo mode de sessionstate a sqlserver o stateserver. A confinuación, debemos modificar el atributo sqlconnectionstring para identificar el nombre del equipo que ejecuta SQL Server o el servidor de estado. Por ejemplo, si se utiliza el modo sqlserver con seguridad integrada, debemos establecer el estado de sesión en Web.config como muestra el siguiente código: <sessionstate mode="sqlserver" sqlconnectionstring="data source=sqlservername; Integrated security=true" /> Configurar el servidor SQL Server Para configurar el servidor SQL Server, debemos utilizar la herramienta desde línea de comandos que proporciona SQL Server, OSQL.exe. OSQL.exe instala la base de datos denominada ASPState, que se utiliza para guardar las variables de aplicación y de sesión. Para instalar la base de datos ASPState utilizado seguridad integrada, utilizar la siguiente sintaxis:
28 Administración del estado c:\> OSQL S SQLServerName -E <InstallSqlState.sql Importante Las opciones del comando OSQL son sensibles a mayúsculas. Si se utiliza un servidor de estado en lugar de un servidor SQL Server, se debe iniciar el servicio ASP.NET de Windows en lugar de instalar una base de datos.
Administración del estado 29 Lección: sesiones con y sin cookies Utilizar cookies para almacenar datos de sesión Práctica dirigida por el instructor: utilizar variables y cookies Recuperar información de una cookie Uso de sesiones que no utilizan cookies Configurar sesiones que no utilizan cookies Objetivos de la lección Las cookies son un medio por el cual la aplicación Web que se ejecuta en el servidor Web puede hacer que un cliente devuelva información al servidor Web con cada solicitud HTTP. La devolución de información puede utilizarse para mantener el estado con el cliente entre múltiples peticiones. Las cookies se envían al cliente como parte del encabezado HTTP en una solicitud del cliente, o se envían en una respuesta del servidor. En esta lección, estudiaremos cómo utilizar cookies para almacenar datos de sesión, y cómo recuperar esos datos de una cookie. También estudiaremos las sesiones que no utilizan cookies y cómo se establecen. En esta lección, aprenderemos a: Utilizar cookies para almacenar datos de sesión. Recuperar información de una cookie. Describir sesiones que no utilizan cookies. Establecer una sesión que no utiliza cookies.
30 Administración del estado Utilizar cookies para almacenar datos de sesión Crear una cookie: HttpCookie HttpCookie objcookie objcookie = new new HttpCookie("myCookie"); HttpCookie DateTime HttpCookie DateTime now now objcookie objcookie = DateTime.Now; = new new HttpCookie("myCookie"); DateTime DateTime now now = DateTime.Now; DateTime.Now; objcookie.values.add("time", now.tostring()); objcookie.values.add("time", objcookie.values.add("forecolor", now.tostring()); "White"); "White"); objcookie.values.add("forecolor", objcookie.values.add("backcolor", "White"); "Blue"); "White"); "Blue"); objcookie.values.add("backcolor", "Blue"); "Blue"); objcookie.expires = now.addhours(1); Response.Cookies.Add(objCookie); Response.Cookies.Add(objCookie); Para crear una cookie persistente, especificar el tiempo de expiración La cookie contiene información sobre el nombre de dominio Set-Cookie: Set-Cookie: Username=John+Chen; path=/; path=/; domain=microsoft.com; Expires=Tuesday, 01-Feb-05 01-Feb-05 00.00.01 00.00.01 GMT GMT Crear una cookie Visual Basic.NET C# Podemos crear cookies utilizando la propiedad Cookies del objeto Response y la clase Request. La propiedad Cookies representa una colección de cookies y es una instancia de la clase HttpCookieCollection. El siguiente código crea una nueva cookie denominada mycookie: Dim objcookie As New HttpCookie("myCookie") Dim now As DateTime = DateTime.Now HttpCookie objcookie = new HttpCookie("MyCookie"); DateTime now = DateTime.Now; El siguiente código agrega un par de claves y valores: Visual Basic.NET C# Hacer una cookie persistente objcookie.values.add("time", now.tostring()) objcookie.values.add("forecolor", "White") objcookie.values.add("backcolor", "Blue") objcookie.values.add("time", now.tostring()); objcookie.values.add("forecolor", "White"); objcookie.values.add("backcolor", "Blue"); El siguiente código establece en una hora el tiempo de expiración de la cookie: Visual Basic.NET objcookie.expires = now.addhours(1) C#
objcookie.expires = now.addhours(1); Administración del estado 31
32 Administración del estado Si no agregamos el código anterior cuando creamos una cookie, ésta será una cookie temporal. La cookie temporal se añade a la memoria del navegador, pero no se almacenará en un archivo. Cuando el usuario cierra el explorador, la cookie se elimina de la memoria. Agregar el código sobre el tiempo de expiración convierte la cookie temporal en una cookie persistente. La cookie persistente se guarda en el disco duro. Con una cookie persistente, si el usuario cierra el explorador y lo abre de nuevo, puede acceder a la misma página Web otra vez hasta que la cookie persistente expire. La expiración de la cookie persistente depende del tiempo de expiración establecido en el código. En el código anterior, la cookie persistente se eliminará transcurrida una hora. Nota Frecuentemente, las cookies persistentes a menudo se utilizan para almacenar información sobre nombres e identificadores de usuario para que el servidor pueda identificar a los usuarios cuando regresen al sitio Web. El siguiente código agrega la nueva cookie a la colección de cookies del objeto Response: Visual Basic.NET C# Cómo funcionan las cookies Response.Cookies.Add(objCookie) Response.Cookies.Add(objCookie); Supongamos que deseamos crear una cookie, denominada Username, que contiene el nombre de un visitante a nuestro sitio Web. Para crear esta cookie, el servidor Web enviará un encabezado HTTP como muestra el siguiente código: Set-Cookie: Username=John+Chen; path=/; domain=microsoft.com; Expires=Tuesday, 01-Feb-05 00.00.01 GMT El encabezado del código de ejemplo anterior manda al navegador que agregue una entrada a su archivo cookie. El explorador agrega la cookie, denominada Username, con el valor John Chen. El atributo domain del código de ejemplo anterior limita el dominio dónde el navegador puede enviar la cookie. En el código de ejemplo anterior, la cookie únicamente puede enviarse al sitio Web Microsoft.com. La cookie nunca se enviará a ningún otro sitio Web de Internet. Después de que el servidor Web cree una cookie, el navegador la devuelve en cada petición que realiza a ese sitio Web. El explorador devuelve la cookie en un encabezado similar al siguiente: Cookie: Username: John+Chen Las cookies que se almacenan en formato de archivo de texto son las cookies persistentes. De forma predeterminada, este archivo se almacena en la carpeta \Documents and Settings\NombreUsuario\Cookies. Cuando las cookies persistentes se almacenan utilizando Internet Explorer, el formato del archivo de texto es: NombreUsuario@NombreDominio.txt
Administración del estado 33 Práctica dirigida por el instructor: utilizar variables y cookies Los estudiantes: Aprenderán a utilizar las variables de aplicación y de sesión, y las cookies persistentes, para almacenar información del usuario Tiempo: 15 Minutos Probar la funcionalidad En esta práctica, veremos cómo se utilizan las variables de aplicación y de sesión, y las cookies persistentes, para almacenar información del usuario. Iniciar sesión en la aplicación Web 1. Abrir Internet Explorer e ir a: http://máquinaprofesor/mod14vb/default.aspx o http://máquinaprofesor/mod14cs/default.aspx. 2. Escribir nuestro nombre en el cuadro de texto, seleccionar un color del cuadro de lista desplegable y hacer clic en Submit. Seremos redireccionados a results.aspx, que muestra nuestro nombre, color seleccionado y la fecha y hora en que accedimos por última vez a default.aspx. results.aspx también muestra el número de visitantes. 3. Actualizar el explorador varias veces. Cada actualización produce un aumento en el número de visitantes, pero nuestro nombre y selección de color permanecen. 4. Cerrar Internet Explorer. 5. Volver a abrir Internet Explorer e ir a: http://máquinaprofesor/mod14vb/results.aspx o http://máquinaprofesor/mod14cs/results.aspx. Aparece nuestro nombre, pero el color que escogimos anteriormente no se muestra. La fecha y hora de nuestro último acceso a default.aspx también se muestra.
34 Administración del estado 6. Cerrar Internet Explorer. Por qué se recuerda nuestro nombre cuando volvemos a visitar el sitio, pero no el color seleccionado? Cómo hace la página el seguimiento del número de visitantes? Visualizar el código 1. En el cuadro de dirección de Windows Explorer, escribir: \\máquinaprofesor\c$\inetpub\wwwroot\mod14vb o \\máquinaprofesor\c$\inetpub\wwwroot\mod14cs Y pulsar ENTER. 2. Abrir la página de código subyacente de la página Default.aspx. Qué dos acciones se producen en el procedimiento de evento btnsubmit_click? 3. En Windows Explorer, hacer doble clic en results.aspx.vb o results.aspx.cs para abrir el archivo de página de código subyacente results.aspx en Visual Studio.NET. En el procedimiento de evento Page_Load, cómo se almacena el número de visitas en la página almacenada? Por qué el código se ubica en una instrucción If en el procedimiento de evento Page_Load? 4. Cerrar Visual Studio.NET.
Administración del estado 35 Visualizar la cookie 1. En Windows Explorer, ir al siguiente directorio del equipo: c:\documents and Settings\Student\Cookies <<Note>> Nota Si se ha iniciado sesión con un nombre de usuario distinto de Student, ir a la carpeta Cookies de esa cuenta de usuario. 2. Hacer doble clic para abrir la cookie denominada student@equipoinstructor[n].txt, siendo n un número de instancia. Qué información podemos encontrar en esta cookie? 3. Cerrar Notepad y Windows Explorer.
36 Administración del estado Recuperar información de una cookie Leer la cookie Dim Dim objcookie objcookie As As HttpCookie HttpCookie = Request.Cookies("myCookie") HttpCookie HttpCookie objcookie objcookie = Request.Cookies["myCookie"]; Recuperar valores de la cookie lbltime.text lbltime.text = objcookie.values("time") lbltime.forecolor = System.Drawing.Color.FromName _ (objcookie.values("forecolor")) lbltime.backcolor = System.Drawing.Color.FromName _ (objcookie.values("backcolor")) lbltime.text lbltime.text = objcookie.values["time"]; lbltime.forecolor = System.Drawing.Color.FromName (objcookie.values["forecolor"]); lbltime.backcolor = System.Drawing.Color.FromName (objcookie.values["backcolor"]); Leer una cookie Visual Basic C# Recuperar valores de la cookie Recuperar información de una cookie implica leer una cookie y recuperar los pares clave/valor de la misma. El cliente devuelve al servidor una cookie en un encabezado HTTP "Cookie:". En este encabezado pueden aparecer múltiples cookies, separadas por punto y coma. Para leer una cookie existente, podemos acceder a la colección de cookies del objeto Request, como muestra el siguiente código: Dim objcookie As HttpCookie = Request.Cookies("myCookie") HttpCookie objcookie = Request.Cookies["myCookie"]; El siguiente código muestra los valores que deben recuperarse de una cookie: Visual Basic.NET C# lbltime.text = objcookie.values("time") lbltime.forecolor = System.Drawing.Color.FromName _ (objcookie.values("forecolor")) lbltime.backcolor = System.Drawing.Color.FromName _ (objcookie.values("backcolor")) lbltime.text = objcookie.values["time"]; lbltime.forecolor = System.Drawing.Color.FromName (objcookie.values["forecolor"]); lbltime.backcolor = System.Drawing.Color.FromName (objcookie.values["backcolor"]);
Administración del estado 37 Uso de sesiones que no utilizan cookies Cada sesión activa está identificada y se realiza su seguimiento utilizando IDs de sesión Los IDs de sesión se comunican entre peticiones cliente-servidor utilizando una cookie HTTP o incluyéndolos en la URL Sesiones que no utilizan cookies La información de ID de sesión está codificada en URLs http://server/(h44a1e55c0breu552yrecobl)/page.aspx No pueden utilizar URLs absolutas La mayoría de navegadores limitan el tamaño de la URL a 255 caracteres, lo cual limita el uso de IDs para las sesiones que no utilizan cookies Sesiones que no utilizan cookies Cada sesión activa está identificada y se realiza su seguimiento utilizando un identificador de sesión SessionID. El SessionID se comunica entre peticiones cliente-servidor utilizando una cookie HTTP o incluyéndolo en la URL. De forma predeterminada, SessionID se almacena en cookies. Sin embargo, los usuarios pueden deshabilitar cookies mediante una configuración en sus navegadores. Si la cookie no puede agregarse al navegador de un usuario, cada petición que realice el usuario iniciará una nueva sesión de usuario. Los datos de sesión asociados a ese usuario se pierden cuando se solicita una nueva página. El marco de trabajo de las páginas ASP.NET incluye una opción que habilita sesiones que no utilizan cookies. Las sesiones que no utilizan cookies permiten aprovechar el estado de sesión incluso con navegadores que tienen deshabilitado el soporte de cookies. Cuando un usuario realiza la primera petición a un sitio Web teniendo habilitado sesiones que no utilizan cookies, la URL que se utiliza para la petición se modifica automáticamente para incluir el SessionID del usuario. Por ejemplo, cuando un usuario solicita http://server/page.aspx, la solicitud se modifica automáticamente a: http://server/(h44a1e55c0breu552yrecobl)/page.aspx la parte de la URL que aparece en paréntesis es el SessionID del usuario actual. Después de que el SessionID se incluya en la URL de la petición de la primera página, el SessionID hace seguimiento del usuario durante su visita al sitio Web.
38 Administración del estado Limitación de las sesiones que no utilizan cookies Existen algunas limitaciones en el uso sesiones que no utilizan cookies: Si decidimos utilizar sesiones que no utilizan cookies, no podemos utilizar URLs absolutas para los enlaces entre páginas. El sitio Web debe diseñarse de forma que cada enlace utilice una URL relativa a la página actual. La mayoría de navegadores limitan el tamaño de la URL a 255 caracteres.
Administración del estado 39 Configuración de sesiones que no utilizan cookies El estado de sesión se configura en la sección <SessionState> de Web.config Configurar cookieless = true <sessionstate cookieless="true" /> /> Configurar una sesión que no utiliza cookies Para habilitar sesiones que no utilizan cookies, es necesario modificar un único atributo del archivo Web.config. En la sección <sessionstate> del archivo Web.config, el atributo cookieless está establecido al valor true. Para habilitar sesiones que no utilizan cookies, lo único que debemos hacer es establecer este valor, como muestra el siguiente código: <sessionstate cookieless="true" />