Procesamiento de páginas de formularios Web Forms En general, el ciclo de vida de una página de formularios Web Forms es similar al de cualquier proceso Web que se ejecuta en el servidor. Algunas características de procesamiento Web, como la información pasada a través del protocolo HTTP, el hecho de que las páginas Web no tengan estado, etc., se aplican a las páginas de formularios Web Forms de la misma forma que a la mayoría de aplicaciones Web. Sin embargo, el marco de trabajo de página ASP.NET realiza por sí sola muchos servicios de aplicación Web. Por ejemplo, el marco de trabajo de página ASP.NET captura la información enviada con la página de formularios Web Forms, extrae los valores importantes y hace que la información sea accesible a través de las propiedades del objeto. Es importante entender la secuencia de eventos que tiene lugar cuando se procesa una página de formularios Web Forms. Este conocimiento le ayudará a programar sus páginas de formularios Web Forms y aplicaciones Web de manera más eficiente. El ciclo de vida de una página de formularios Web Forms Puede serle útil comprender ciertas características fundamentales sobre cómo trabajan las páginas de formularios Web Forms en las aplicaciones Web antes de examinar los detalles de lo que sucede en una página cuando ésta se procesa. Acciones de ida y vuelta Uno de los conceptos principales que debe comprender es la división del trabajo en una página de formularios Web Forms. El explorador presenta el formulario al usuario y éste interactúa con él, causando que el formulario se envíe de vuelta al servidor. Sin embargo, como todo procesamiento que interactúa con componentes de servidor debe ocurrir en el servidor, esto significa que, para cada acción que necesita procesamiento, el formulario debe enviarse al servidor, procesarse y ser devuelto al explorador. Esta secuencia de eventos se conoce con el nombre de acción de ida y vuelta. Nota Puede crear una secuencia de comandos de cliente en formularios Web Forms, que puede serle útil para validar la introducción de datos por el usuario y para algunos tipos de programación de UI. La secuencia de comandos de cliente no interactúa con los componentes de servidor. Imagine un escenario empresarial: un usuario introduce un pedido y usted desea confirmar si existe inventario suficiente para el pedido, por lo que su aplicación envía la página al servidor en un punto determinado del proceso de entrada del pedido del usuario. Un proceso de servidor examina el pedido, realiza una búsqueda en el inventario, quizás realice alguna acción definida en la lógica de negocio (como modificar la página para indicar un error) y devuelve la página al explorador para que el usuario continúe. Acción de ida y vuelta 1 En los formularios Web Forms, la mayoría de las acciones del usuario, como hacer clic en un botón, dan como resultado una acción de ida y vuelta. Por dicha razón, los eventos disponibles en los controles de servidor ASP.NET suelen limitarse a eventos de tipo clic. La mayoría de los controles de servidor exponen un evento Click, que requiere una respuesta explícita del usuario. Por la misma razón, los controles de servidor no exponen eventos que se producen con mucha frecuencia, como, por ejemplo, onmouseover, porque cada vez que se produce un evento, ocurre una nueva acción de ida y vuelta al servidor, lo que afecta considerablemente al tiempo de respuesta del formulario. Volver a crear la página (estado de vista y administración de estado) En cualquier escenario Web, las páginas se vuelven a crear con cada acción de ida y vuelta. Tan pronto como el servidor termina de procesar y enviar la página al explorador, descarta la información de la página. Mediante la liberación de recursos de servidor después de cada petición, se puede ajustar una aplicación Web para que admita cientos o miles de usuarios simultáneos. La siguiente vez que se envía la página, el servidor empieza a crearla y procesarla y, por esta razón, se dice que las páginas Web no tiene estado, ya que los valores de las variables y controles de una página no se conservan en el servidor. Nota Se puede configurar el servidor para que almacene la información de la página en la memoria caché y así optimizar las páginas, pero para el objetivo de la programación de aplicaciones, es mejor pensar que se eliminan tan pronto como el servidor ha terminado de procesarlas. En una aplicación Web tradicional, la única información que tiene el servidor sobre el formulario es aquella que ha agregado el usuario a los controles del formulario, porque dicha información es enviada al servidor con el formulario. Cualquier otro tipo de información, como los valores de las variables y la configuración de las propiedades, se elimina. ASP.NET soluciona estas limitaciones de las siguientes formas: 2 • • • Guarda la página y las propiedades de los controles entre las acciones de ida y vuelta. Esto se conoce como guardar el estado de vista del control. Proporciona servicios de administración de estado para que pueda guardar su propia información sobre las variables e información específica de la aplicación o de la sesión entre acciones de ida y vuelta. Puede detectar cuándo es pedido un formulario por primera vez y cuándo es enviado, lo que le permite programar de manera conveniente. Puede desear un comportamiento diferente durante la devolución de datos de la página y durante la petición inicial. Ventajas de un modelo orientado a eventos contra un modelo de procesamiento lineal Si ya tiene experiencia en el uso de ASP (Active Server Pages, páginas Active Server), sabrá que ASP es un modelo de programación lineal. Una página ASP se procesa en una secuencia de arriba abajo. Cada línea de código ASP y HTML estático se procesa en secuencia tal y como aparece en el archivo. Las acciones del usuario hacen que la página se envíe al servidor en una acción de ida y vuelta. Por esta razón, el servidor debe volver a crear la página. Una vez que la página se ha creado de nuevo, se procesa en la misma secuencia de arriba abajo anterior. Por lo tanto, la página no muestra un comportamiento real de orientación a eventos. Para que esté orientada a eventos, es necesario diseñarla explícitamente. Además, tiene que mantener explícitamente el estado de la página y de los controles al más bajo nivel. Este modelo limita la riqueza de las interfaces de usuario que se pueden ensamblar y aumenta la complejidad del código. En comparación, un modelo orientado a eventos, como es el caso de una aplicación de Visual Basic tradicional, contiene elementos programables que se inicializan y se muestran en el formulario. El usuario interactúa con los elementos, lo que produce eventos que, por turnos, llaman a los controladores de eventos. Este modelo admite un comportamiento real de orientación a objetos que, mediante diseño, aumenta la riqueza de las interfaces de usuario que se pueden ensamblar y reduce la complejidad del código. ASP.NET reemplaza el modelo de procesamiento lineal de ASP emulando el comportamiento de un modelo orientado a eventos. El marco de trabajo de página ASP.NET sirve para realizar implícitamente las asociaciones de un evento a un controlador de evento. Mediante el marco de trabajo de páginas se puede crear fácilmente una interfaz de usuario que reaccione a las acciones del usuario. Para obtener información detallada sobre la creación y utilización de eventos y controladores de eventos, vea Control de eventos de servidor en páginas de formularios Web Forms. Adicionalmente, este mismo marco de trabajo facilita la implementación de la administración de estado de la página y los controles. Para obtener más información sobre la administración de estado, vea Administración del estado de los formularios Web Forms. Por ejemplo, ASP.NET le permite configurar controladores de eventos en el código de servidor para los eventos que se pasan desde el explorador. Imagine que el usuario está interactuando con una página de formularios Web Forms que contiene un único control de servidor de botón. El usuario hace clic en el control de botón y se produce un evento que se transmite al servidor mediante un envío HTTP, donde el marco de trabajo de página ASP.NET interpreta la información enviada y asocia el evento producido a un controlador de evento apropiado. Este controlador de evento puede ser un controlador predeterminado proporcionado por ASP.NET o una implementación personalizada. El marco de trabajo llama automáticamente al controlador de evento correspondiente al botón como parte del procesamiento normal del marco de trabajo. Como resultado, ya no necesita diseñar explícitamente un comportamiento orientado a eventos en un modelo de procesamiento lineal. Para obtener más información sobre el control de eventos en formularios Web Forms, vea Modelo de eventos de controles de servidor ASP.NET. Fases del procesamiento de formularios Web Forms 3 El marco de trabajo de página ASP.NET procesa las páginas de formularios Web Forms en distintas fases. Durante cada fase del procesamiento de formularios Web Forms, se pueden producir eventos, por lo que se ejecutará el controlador de evento correspondiente. Dichos métodos le proporcionan puntos de entrada, enlaces, que le permiten actualizar el contenido de la página de formularios Web Forms. La tabla siguiente muestra una lista de las fases más comunes del procesamiento de página, los eventos que se producen y los usos más frecuentes de cada fase. Estas fases se repiten cada vez que se solicita o se envía el formulario. La propiedad Page.IsPostBack le permite probar si la página está siendo procesada por primera vez. Nota Existen más fases de procesamiento de una página de formularios Web Forms que las que aparecen en la lista siguiente. Sin embargo, no se utilizan en la mayoría de los escenarios de procesamiento de páginas. Las usan fundamentalmente los controles de servidor de la página de formularios Web Forms para tareas de inicialización y procesamiento. Si intenta escribir sus propios controles de servidor ASP.NET, necesitará un conocimiento más profundo de dichas fases. Para obtener información detallada acerca de todas las fases de procesamiento de páginas, vea Programar controles de servidor de ASP.NET. Fase Inicialización del marco de trabajo de página ASP.NET Inicialización del código de usuario Significado Usos típicos Se produce el evento Page_Init de la Durante este evento, el marco de trabajo de página y se restaura el estado de vista página ASP.NET restaura las propiedades de de la página y los controles. los controles y de los datos devueltos. Se produce el evento Page_Load de la Leer y restaurar valores almacenados página. previamente: • • • • Validación Control de eventos Usar la propiedad Page.IsPostBack para comprobar si es la primera vez que se procesa la página. Si es la primera vez, realizar enlace de datos inicial. Si no, restaurar los valores de los controles. Leer y actualizar las propiedades de los controles. El método Validate de cualquier (En esta fase no existe ningún enlace de control de servidor Web de validación usuario. Puede probar el resultado de la permite ejecutar la validación validación en un controlador de evento). especificada del control. En esta fase, si la página fue llamada Realizar el procesamiento específico de la en respuesta a un evento del aplicación: formulario, se llama al controlador de evento correspondiente. • Controlar el evento producido. Nota Los eventos no se producen en un orden concreto, exceptuando los eventos de controles almacenados en memoria caché, que se especifican en la propiedad AutoPostBack del control y que siempre se 4 Fase Significado Usos típicos procesan antes de enviar el evento. • • • • Limpieza Se llama al evento Page_Unload porque la página ha terminado de procesarse y está lista para ser eliminada. Si la página contiene Tipos de validación Tipos de validación para controles de servidor ASP.NET, comprobar la propiedad IsValid de la página y de cada control de validación. Guardar de forma manual el estado de las variables de la página que está manteniendo usted mismo. Compruebe la propiedad IsValid de la página o de los controles de validación individuales. Guardar de forma manual el estado de los controles que se agregan dinámicamente a la página. Realizar el trabajo de limpieza final: • • • Cerrar archivos. Cerrar conexiones a bases de datos. Eliminar objetos. Nota Es importante que los recursos caros, como las conexiones de base de datos, se cierren explícitamente. En caso contrario, se mantendrán abiertas hasta que ocurra la siguiente recolección de elementos no utilizados. En un servidor muy cargado, el hecho de tener muchos recursos abiertos puede afectar al rendimiento. Recomendaciones de administración de estado La administración de estado es el proceso por el cual se conserva el estado y la información de la página a través de múltiples peticiones de la misma página o de páginas diferentes. Al igual que la tecnología basada en HTTP, los formularios Web Forms no tienen estado, lo que significa que no indican de manera automática si todas las peticiones que se realizan en secuencia provienen del mismo cliente ni si una instancia del explorador todavía está viendo una página o un sitio de manera activa. Además, las páginas se destruyen y se vuelven a crear con cada acción de ida y vuelta al servidor, lo que significa que la información de una página no se conservará fuera del ciclo de vida de la página. Para obtener más información sobre los recorridos de 5 ida y vuelta al servidor y el ciclo de vida de las páginas de formularios Web Forms, vea Procesamiento de páginas de formularios Web Forms. ASP.NET ofrece distintas maneras de conservar el estado entre acciones de ida y vuelta al servidor. La selección de una de las opciones de administración de estado disponibles en ASP.NET dependerá fundamentalmente de la aplicación y debería basarse en los siguientes criterios: • • • • • ¿Qué cantidad de información debería almacenar? ¿El cliente aceptará cookies persistentes o en memoria? ¿Desea almacenar la información en el cliente o en el servidor? ¿Se trata de información confidencial? ¿Qué tipo de criterios de rendimiento tiene para la aplicación? ASP.NET es compatible con varias opciones de administración de estado en el cliente y en el servidor. Las opciones en el cliente son: • • • • Propiedad ViewState Campos ocultos Cookies Cadenas de consulta Las opciones en el servidor son: • • • Estado de aplicación Estado de sesión Base de datos Opciones de administración de estado en el cliente Las opciones en el cliente para almacenar la información de página no utilizan recursos de servidor. Estas opciones ofrecen poca seguridad pero un rendimiento rápido del servidor porque la demanda de recursos de servidor es pequeña. Sin embargo, puesto que se debe enviar información al cliente para su almacenamiento, existe un límite práctico para la información que puede almacenarse de esta forma. Estado de la vista Las páginas de formularios Web Forms proporcionan la propiedad ViewState como una estructura integrada para conservar automáticamente valores entre varias peticiones de una misma página. El estado de vista se mantiene en la página en forma de campo oculto. Para obtener más información, vea Introducción a la administración del estado de formularios Web Forms. Puede utilizar el estado de vista para almacenar los valores específicos de su propia página entre recorridos de ida y vuelta, cuando la página se envía de nuevo a sí misma. Por ejemplo, si la aplicación mantiene información específica del usuario (es decir, información utilizada en la página pero que no forma parte necesariamente de ningún control), se puede almacenar en el estado de vista. Las ventajas de utilizar el estado de vista son: • No se necesitan recursos de servidor. El estado de vista está dentro de una estructura del código de la página. 6 • • • Implementación sencilla. Retención automática del estado de la página y de los controles. Funciones de seguridad ampliadas. Los valores de estado de vista se trocean, comprimen y codifican para implementaciones de Unicode, lo que representa un mayor nivel de seguridad que el de los simples campos ocultos. Las desventajas de utilizar el estado de vista son: • • Rendimiento. Puesto que el estado de vista se almacena en la propia página, el almacenamiento de valores de gran tamaño puede hacer que la página se muestre y se envíe de forma más lenta para los usuarios. Seguridad. El estado de vista se almacena en la página en forma de campo oculto. Aunque el estado de vista almacena los datos troceados, se puede manipular. Se puede ver la información de un campo oculto si se obtiene acceso al código fuente de la página directamente, lo que supone un problema de seguridad potencial. Para obtener más información, vea Introducción a la seguridad de aplicaciones Web.. Para obtener más información sobre cómo utilizar el estado de vista, vea Guardar valores de páginas de formularios Web Forms mediante el estado de vista. Campos ocultos Puede almacenar información específica de una página en un campo oculto de la página como forma de conservar el estado de la misma. Para obtener más información sobre campos ocultos, vea Introducción a la administración del estado de formularios Web Forms. Si utiliza campos ocultos, es mejor almacenar sólo cantidades pequeñas de datos que cambian con frecuencia en el cliente. El control HtmlInputHidden de ASP.NET le ofrece la funcionalidad de campo oculto. Para obtener más información acerca de HtmlInputHidden, vea Controles de servidor ASP.NET por función. Nota Si utiliza campos ocultos, deberá enviar las páginas al servidor mediante el método POST de HTTP, en lugar de solicitar la página mediante su URL (es decir, mediante el método GET de HTTP). Las ventajas de utilizar campos ocultos son: • • • No se necesitan recursos de servidor. El campo oculto se almacena y se lee en la página. Compatibilidad amplia. La mayoría de los exploradores y dispositivos de cliente admiten formularios con campos ocultos. Implementación sencilla. Las desventajas de utilizar campos ocultos son: • • • Seguridad. Los campos ocultos se pueden alterar. Se puede ver la información de un campo oculto si se obtiene acceso al código fuente de la página directamente, lo que supone un problema de seguridad potencial. Para obtener más información, vea Introducción a la seguridad de aplicaciones Web.. Estructura de almacenamiento limitada. El campo oculto no admite grandes estructuras. Los campos ocultos sólo ofrecen un campo de valor donde colocar la información. Para almacenar múltiples valores, debe implementar cadenas delimitadas y que el código analice estas cadenas. Rendimiento. Puesto que los campos ocultos se almacenan en la propia página, el almacenamiento de valores de gran tamaño puede hacer que la página se muestre y se envíe de forma más lenta para los usuarios. 7 Cookies Las cookies son útiles para almacenar pequeñas cantidades de información que cambia con frecuencia en el cliente. La información se envía al servidor con la petición. Las ventajas de utilizar cookies son: • • • No se necesitan recursos de servidor. La cookie se almacena en el cliente y es leída por el servidor después del envío. Simplicidad. Una cookie es una estructura ligera y basada en texto con simples pares clave-valor. La caducidad se puede configurar. La cookie puede caducar cuando se cierre la sesión del explorador o puede existir indefinidamente en el equipo cliente, sujeta a las reglas de caducidad del mismo. Las desventajas de utilizar cookies son: • • • • Tamaño limitado. La mayoría de los exploradores tienen un límite de 4096 bytes para el tamaño de cookie, aunque cada vez es más frecuente que las nuevas versiones de exploradores y dispositivos de cliente disponibles actualmente admitan un tamaño de cookie de 8192 bytes. El usuario puede configurar el rechazo de cookies. Algunos usuarios desactivan la capacidad de recibir cookies de su explorador o dispositivo cliente, limitando así esta funcionalidad. Seguridad. Las cookies se pueden alterar. Los usuarios pueden manipular las cookies en el equipo, lo que potencialmente puede influir en la seguridad o hacer que la aplicación que depende de la cookie falle. Para obtener más información, vea Introducción a la seguridad de aplicaciones Web. Durabilidad. La durabilidad de una cookie en un equipo cliente está sujeta a los procesos de caducidad de cookies del cliente y a la intervención del usuario. Nota Las cookies se utilizan a menudo para tareas de personalización, donde el contenido se personaliza para cada usuario. En la mayoría de estos casos, el objetivo es más de identificación que de autenticación, por lo que es suficiente almacenar en la cookie el nombre de usuario, el nombre de cuenta o un identificador de usuario único (como un GUID) y utilizarlo para tener acceso a la infraestructura de personalización de usuario de un sitio. Para obtener detalles acerca de la creación y lectura de cookies, vea HttpResponse.Cookies (Propiedad) y HttpRequest.Cookies (Propiedad). Cadenas de consulta Una cadena de consulta es información que se anexa al final de la dirección URL de una página. Para obtener más información, vea Introducción a la administración del estado de formularios Web Forms. Puede utilizar una cadena de consulta para enviar datos de vuelta a la página o a otra página a través de la dirección URL. Las cadenas de consulta proporcionan una manera sencilla pero limitada de mantener cierta información de estado. Por ejemplo, es una manera sencilla de pasar información de una página a otra, por ejemplo, pasar un código de producto de una página a otra donde se procesará. Nota Las cadenas de consulta sólo son viables cuando se hace una petición de la página mediante su dirección URL. No puede leer la cadena de consulta de una página cuando ésta ya se ha enviado al servidor. Las ventajas de utilizar cadenas de consulta son: 8 • • • No se necesitan recursos de servidor. La cadena de consulta está dentro de la petición HTTP de una dirección URL específica. Compatibilidad amplia. Casi todos los exploradores y dispositivos de cliente admiten el paso de valores en una cadena de consulta. Implementación sencilla. ASP.NET es totalmente compatible con el método de cadenas de consulta, incluyendo métodos para leer cadenas de consulta mediante la propiedad HttpRequest.Params. Las desventajas de utilizar cadenas de consulta son: • • Seguridad. El usuario puede ver directamente la información de una cadena de consulta en la interfaz de usuario del explorador. Las cadenas de consulta están expuestas en Internet a través de la dirección URL, lo que en algunos casos puede afectar a la seguridad. Para obtener más información, vea Introducción a la seguridad de aplicaciones Web. Capacidad limitada. En la mayoría de los exploradores y dispositivos de cliente la longitud de la dirección URL tiene una limitación de 255 caracteres. Resumen de los métodos de administración de estado en el cliente En la tabla siguiente se resumen las opciones de administración de estado del cliente y cuándo se debe considerar su uso. Método Estado de vista Campos ocultos Cookies Cadena de consulta Utilícelo cuando Necesite almacenar cantidades pequeñas de información de una página que será enviada de vuelta. El uso de la propiedad ViewState proporciona funcionalidad con una seguridad básica. Necesite almacenar cantidades pequeñas de información de una página que será enviada de vuelta o de otra página y la seguridad no sea un problema. Nota Sólo puede utilizar campos ocultos en páginas que se envíen al servidor. Necesite almacenar cantidades pequeñas de información en el cliente y la seguridad no sea un problema. Transfiera cantidades pequeñas de información de una página a otra y la seguridad no sea un problema. Nota Sólo puede utilizar cadenas de consulta cuando hace una petición de la misma página o de otra página a través de un vínculo. Opciones de administración de estado en el servidor Las opciones para almacenar información de la página en el servidor suelen proporcionar un mayor nivel de seguridad que las opciones en el cliente, pero pueden utilizar mayor número de recursos de servidor Web, lo que puede afectar a la escalabilidad cuando el tamaño de la información almacenada es grande. ASP.NET proporciona distintas opciones para implementar la administración de estado en el servidor. Para obtener más información, vea Introducción a la administración del estado de formularios Web Forms. Estado de aplicación ASP.NET proporciona el estado de la aplicación mediante la clase HttpApplicationState, como método para almacenar información global específica de la aplicación de forma que sea visible para toda la aplicación. Las 9 variables de estado de la aplicación son variables globales de una aplicación ASP.NET. Para obtener más información, vea Estado de la aplicación. Se pueden almacenar los valores específicos de la aplicación en el estado de aplicación, que administra el servidor. Para obtener más información, vea Introducción a la administración del estado de formularios Web Forms. Los datos que se suelen insertar en las variables de estado de la aplicación son los datos compartidos por múltiples sesiones y que no cambian a menudo. Nota Si se almacena un conjunto de datos en el estado de aplicación, se deberá volver a convertir de Object en conjunto de datos. Para obtener detalles, vea Recomendaciones sobre la estrategia de acceso a datos Web. Las ventajas de utilizar el estado de aplicación son: • • Implementación sencilla. El estado de aplicación es fácil de usar, conocido por los programadores de ASP y coherente con otras clases de .NET Framework. Ámbito global. Puesto que el estado de aplicación es accesible para todas las páginas de una aplicación, utilizarlo para almacenar información se traduce en guardar una única copia de la información (a diferencia, por ejemplo, de guardar copias de la información en el estado de sesión o en páginas individuales). Las desventajas de utilizar el estado de aplicación son: • • • Ámbito global. La naturaleza global del estado de aplicación puede también representar un inconveniente. Las variables que se almacenan en el estado de la aplicación son globales sólo para el proceso en el que se está ejecutando la aplicación y cada proceso de aplicación puede tener valores diferentes. Por lo tanto, no puede basarse en el estado de la aplicación para almacenar valores únicos o para actualizar contadores globales en configuraciones Web-garden y de baterías de servidores Web. Durabilidad. Como los datos globales almacenados en el estado de la aplicación son volátiles, se perderán si se destruye el proceso de servidor Web que los contiene, en la mayoría de los casos porque el servidor se quede bloqueado, se actualice o se apague. Requisitos de recursos. El estado de aplicación necesita memoria del servidor, lo que puede afectar al rendimiento del mismo, así como a la escalabilidad de la aplicación. Mediante un cuidadoso diseño y una buena implementación del estado de la aplicación puede mejorar el rendimiento de la aplicación Web. Por ejemplo, si se utiliza el estado de aplicación para guardar conjuntos de datos de uso común y relativamente estáticos, se puede aumentar el rendimiento del sitio mediante la reducción del número global de solicitudes a la base de datos. Sin embargo, existe una contrapartida relativa al rendimiento. Las variables de estado de aplicación que contienen grandes bloques de información reducen el rendimiento del servidor Web a medida que aumenta la carga del mismo. La memoria que ocupa una variable almacenada en el estado de la aplicación no se libera hasta que el valor es eliminado o reemplazado. Por tanto, es mejor utilizar variables de estado de aplicación sólo con conjuntos de datos pequeños y cuya modificación sea poco frecuente. Para obtener más información sobre la optimización de aplicaciones Web ASP.NET, vea Optimización de ASP.NET. Estado de sesión ASP.NET proporciona el estado de sesión, disponible mediante la clase HttpSessionState, como método para almacenar información específica de la sesión de forma que sea visible sólo dentro de ésta. Para obtener más información, vea Introducción a la administración del estado de formularios Web Forms y Estado de sesión. 10 Se pueden almacenar los valores y objetos específicos de la sesión en el estado de sesión, que el servidor administra, y que está disponible para el explorador o el dispositivo cliente. Lo ideal es almacenar en las variables de estado de la sesión datos de duración corta, datos confidenciales para una sesión individual específica. Nota Si se almacena un conjunto de datos en el estado de aplicación, se deberá volver a convertir de Object en conjunto de datos. Vea Recomendaciones sobre la estrategia de acceso a datos Web. Las ventajas de utilizar el estado de sesión son: • • • • • Implementación sencilla. El estado de sesión es fácil de usar, conocido por los programadores de ASP y coherente con otras clases de .NET Framework. Eventos específicos de sesión. Su aplicación puede producir y utilizar los eventos de administración de sesión. Durabilidad. Los datos guardados en variables de estado de sesión pueden sobrevivir al reinicio de los Servicios de Internet Information Server (IIS) y al reinicio de los procesos de trabajo sin perder datos de sesión, ya que éstos se almacenan en otro espacio de proceso. Escalabilidad de plataforma. El estado de sesión se puede utilizar en configuraciones multisistema y multiproceso, optimizando así las diversas situaciones de escalabilidad. El estado de sesión funciona con los exploradores que no admiten las cookies HTTP, aunque se suele utilizar en combinación con éstas para proporcionar servicios de identificación de usuario a las aplicaciones Web. Para obtener más información sobre el uso del estado de sesión sin cookies, vea Secciones de configuración de ASP.NET. Para obtener más información, vea Estado de la sesión. La desventaja de utilizar el estado de sesión es: • Rendimiento. Las variables de estado de la sesión permanecen en memoria hasta que se eliminan o reemplazan y pueden empeorar el rendimiento del servidor. Las variables de estado de la sesión que contienen grandes bloques de información como conjuntos de datos, pueden afectar negativamente al rendimiento del servidor Web a medida que aumenta la carga. Compatibilidad con bases de datos En algunos casos, puede preferir el uso de la compatibilidad con bases de datos para conservar el estado en el sitio Web. Generalmente, la compatibilidad con bases de datos se utiliza en combinación con las cookies o el estado de sesión. Por ejemplo, es muy frecuente que un sitio Web de comercio electrónico conserve la información de estado mediante una base de datos relacional por las siguientes razones: • • • • Seguridad Personalización Coherencia Extracción de datos Las características típicas de un sitio Web con base de datos combinado con cookies: • Seguridad. El usuario escribe un nombre de cuenta y una contraseña en una página de inicio de sesión del sitio. La infraestructura del sitio hace una consulta en la base de datos con los valores de inicio de sesión para determinar si el usuario dispone de los permisos necesarios para utilizar el sitio. Si la base de datos valida la información del usuario, el sitio Web distribuirá una cookie válida que 11 • • • contenga un identificador único para ese usuario en el equipo cliente. El sitio concede el acceso al usuario. Personalización. Una vez tratada la información de seguridad, el sitio es capaz de distinguir a cada usuario leyendo la cookie en el equipo cliente. Normalmente, los sitios tienen información en la base de datos que describe las preferencias de cada usuario (identificado por un identificador único). Esta relación se conoce como personalización. El sitio puede investigar las preferencias del usuario utilizando el identificador único que contiene la cookie y, a continuación, colocar el contenido y la información a disposición del usuario según sus deseos específicos e ir reaccionando a las preferencias del usuario. Coherencia. Si ha creado un sitio Web de comercio electrónico, es posible que desee mantener los registros transaccionales de las compras de productos y servicios realizadas en el sitio. Puede guardar esta información en la base de datos de un modo confiable y hacer referencia a ella con el id. exclusivo del usuario. Puede utilizarla para determinar si una transacción de compra se ha completado y, en el caso de que ésta haya fallado, para determinar el curso de las acciones a seguir. También se puede utilizar para informar al usuario sobre el estado de un pedido situado en el sitio. Extracción de datos. La información sobre el uso del sitio, los visitantes o las transacciones de un producto se pueden almacenar de forma segura en la base de datos. Por ejemplo, el departamento de desarrollo de la empresa puede utilizar los datos recogidos del sitio para determinar la línea de productos o la política de distribución para el próximo año. El departamento de marketing puede examinar información demográfica sobre los usuarios del sitio. Los departamentos de ingeniería y soporte pueden analizar las transacciones y observar las áreas donde se podría mejorar el proceso de compra. La mayoría de las bases de datos relacionales a nivel empresarial, como, por ejemplo, Microsoft SQL Server, contienen un amplio conjunto de herramientas para la mayor parte de proyectos de extracción de datos. Si se diseña el sitio Web para que consulte repetidamente a la base de datos mediante el identificador exclusivo durante cada una de las fases generales de la situación descrita, el sitio mantiene el estado. De esta manera, el usuario percibe que el sitio le recuerda y que reacciona de manera personalizada. Las ventajas de utilizar una base de datos para conservar el estado son: • • • • • • Seguridad. El acceso a bases de datos suele ser muy seguro, ya que exige una rigurosa autenticación y autorización. Capacidad. Se puede almacenar en la base de datos tanta información como se desee. Persistencia. La información de la base de datos se puede almacenar durante el tiempo deseado, y no está sujeta a la disponibilidad del servidor Web. Solidez e integridad de datos. Las bases de datos suelen incluir diversas funciones para el mantenimiento de la corrección de los datos, entre ellas desencadenadores e integridad referencial, transacciones, etc. Si se guarda la información de transacciones en una base de datos (en lugar de en el estado de sesión), es más rápido recuperarse de los errores. Accesibilidad. Los datos almacenados en la base de datos son accesibles para una amplia variedad de herramientas de proceso de información. Amplia compatibilidad. Existe un gran número de herramientas de bases de datos disponibles así como configuraciones personalizadas. Las desventajas de utilizar una base de datos para conservar el estado son: • • Complejidad. La utilización de una base de datos para la administración del estado implica configuraciones hardware y software más complejas. Rendimiento. Una mala construcción del modelo de datos relacionales puede derivar en problemas de ajuste. También, el uso de demasiadas consultas a la base de datos puede afectar negativamente al rendimiento del servidor. Resumen de los métodos de administración de estado en el servidor 12 En la tabla siguiente se resumen las opciones de administración de estado del servidor, y cuándo se debe considerar su uso. Método Estado de aplicación Estado de sesión Compatibilidad con bases de datos Utilícelo cuando Se almacena información global que raramente cambia, y que utilizan muchos usuarios, y la seguridad no es una cuestión importante. No utilice el estado de aplicación para almacenar grandes cantidades de información. Almacene información de corta duración que es específica de una sesión individual y la seguridad no sea un problema. No utilice el estado de sesión para almacenar grandes cantidades de información. Tenga en cuenta que un objeto de estado de sesión se creará y conservará durante el ciclo de vida de cada sesión de la aplicación. En aplicaciones que hospeden a muchos usuarios, esto puede ocupar un número significativo de recursos de servidor y afectar a la escalabilidad. Almacene gran cantidad de información, administre transacciones o la información deba conservarse aunque se vuelva a iniciar la aplicación o la sesión. Suele utilizarse para la extracción de datos, y la seguridad es una cuestión importante a tener en cuenta. 13 Introducción a la administración del estado de formularios Web Forms Las páginas Web se vuelven a crear cada vez que la página se envía al servidor. En la programación Web tradicional, esto se traduce en que toda la información asociada a la página y los controles de la misma se pierden con cada recorrido de ida y vuelta. Por ejemplo, si un usuario escribe información en un cuadro de texto, dicha información se perderá en el recorrido de ida y vuelta desde el explorador o dispositivo cliente al servidor. Para obtener más información, vea Procesamiento de páginas de formularios Web Forms. Para superar esta limitación inherente a la programación Web tradicional, el marco de trabajo de las páginas ASP.NET incluye diversas opciones que ayudan a conservar los cambios; es decir, opciones de administración de estado. El marco de trabajo de la página incluye un servicio denominado estado de vista, que conserva automáticamente los valores de las propiedades de la página y de todos sus controles de un recorrido de ida y vuelta a otro. Sin embargo, es posible que también haya valores específicos de la aplicación que se desee conservar. Para ello, se puede utilizar una de las opciones de administración de estado. Alguna de estas opciones mantienen la información en el cliente, por ejemplo, directamente en la página o en una cookie, y otras almacenan la información en el servidor entre acciones de ida y vuelta. Cada opción tiene sus ventajas y desventajas. Opciones de administración de estado basada en cliente Las siguientes secciones describen opciones para administrar el estado que almacenan la información en la página o en el equipo cliente. En estas opciones, la información no se conserva en el servidor entre acciones de ida y vuelta. Estado de la vista La propiedad Control.ViewState proporciona un objeto de diccionario para conservar valores entre las distintas peticiones de una misma página. Este es el método que la página utiliza para conservar los valores de las propiedades de la propia página y sus controles entre recorridos de ida y vuelta. Cuando se procesa la página, el estado actual de la página y de los controles se guarda troceado en una cadena, que se guarda en la página en forma de campo oculto. Cuando se vuelve a enviar la página al servidor, la página analiza la cadena de estado de vista y restablece en ella la información de propiedades. En un estado de vista se puede también almacenar valores. Para obtener detalles, vea Guardar valores de páginas de formularios Web Forms mediante el estado de vista. Para obtener recomendaciones de uso del estado de vista, vea Recomendaciones de administración de estado. Campos de formulario ocultos ASP.NET permite utilizar en un formulario campos ocultos HTML estándar. Un campo oculto no está visible en el explorador, pero se pueden configurar sus propiedades igual que las de un control estándar. Cuando se envía una página al servidor, el contenido del campo oculto se envía en la colección Form de HTTP junto con los valores de otros controles. Un campo oculto actúa como un repositorio de cualquier información específica que desee almacenar directamente en la página. 14 Nota de seguridad Es fácil que un usuario malicioso vea y modifique el contenido de un campo oculto. No almacene ninguna información que sea confidencial o en la que se base la aplicación para funcionar correctamente en un campo oculto. Un campo oculto almacena una única variable en su propiedad value, y se debe agregar a la página de forma explícita. Después se inserta el valor en el campo oculto. ASP.NET ofrece el control HtmlInputHidden, que ofrece funciones para el manejo de campos ocultos. Para obtener más información, vea Controles de servidor ASP.NET por función. Para que los valores de los campos ocultos estén disponibles durante el procesamiento de la página, debe enviar la página utilizando el método POST de HTTP. Es decir, no puede beneficiarse de los campos ocultos si la página se procesa como respuesta a un vínculo o a un método GET de HTTP. Para obtener recomendaciones de uso, vea Recomendaciones de administración de estado. Cookies Una cookie es una cantidad pequeña de datos que se almacena en un archivo de texto en el sistema de archivos del cliente o que se mantiene en memoria en la sesión del explorador cliente. Contiene información específica de la página que envía el servidor al cliente junto con el resultado de la página. Las cookies pueden ser temporales (con fechas y horas de caducidad específicas) o permanentes. Las cookies se pueden utilizar para almacenar información acerca de un cliente, sesión o aplicación específicos. Las cookies se guardan en el dispositivo cliente y, cuando el explorador solicita una página, envía la información de la cookie junto con la información de solicitud. El servidor puede leer la cookie y extraer su valor. Uno de los usos típicos es almacenar un símbolo (puede que cifrado) que indica que el usuario ya se ha autenticado en la aplicación. Nota de seguridad El explorador puede devolver los datos sólo al servidor que creó la cookie. Sin embargo, algunos usuarios con malas intenciones cuentan con medios para "robar" cookies y leer su contenido. Se recomienda no almacenar información confidencial, como el nombre de usuario o la contraseña, en una cookie. En su lugar, almacene un símbolo (token) que pueda utilizar para buscar la información reservada en el servidor. Para obtener más información sobre el uso de cookies, vea HttpResponse.Cookies (Propiedad) y Recomendaciones de administración de estado. Cadenas de consulta Una cadena de consulta es información que se anexa al final de la dirección URL de una página. Un ejemplo típico podría tener el siguiente aspecto: http://www.contoso.com/listwidgets.aspx?category=basic&price=100 En la ruta URL indicada, la cadena de consulta empieza con un signo de interrogación (?) e incluye dos parejas de atributo-valor, una de ellas denominada "category", y la otra denominada "price". Las cadenas de consulta proporcionan una manera sencilla pero limitada de mantener cierta información de estado. Por ejemplo, es una manera sencilla de pasar información de una página a otra, por ejemplo, pasar un código de producto de una página a otra donde se procesará. Sin embargo, en la mayoría de los exploradores y dispositivos de cliente la longitud de la dirección URL tiene una limitación de 255 caracteres. Nota de seguridad La información pasada en una cadena de consulta puede ser manipulada por un usuario con malas intenciones. No utilice cadenas de consulta para 15 transmitir información importante o confidencial. Para obtener más información, vea Ataques mediante secuencias de comandos. Para que los valores de las cadenas de consulta estén disponibles durante el procesamiento de la página, debe enviar la página utilizando el método get de HTTP. Es decir, no puede beneficiarse de las cadenas de consulta si la página se procesa como respuesta a un método post de HTTP. Para obtener recomendaciones de uso, vea Recomendaciones de administración de estado. Opciones de administración de estado basada en servidor ASP.NET le ofrece distintas maneras de conservar la información de estado en el servidor, como se describe en las secciones siguientes. Estado de aplicación ASP.NET permite guardar valores utilizando el estado de la aplicación (una instancia de la clase HttpApplicationState) para cada aplicación Web activa. Estado de aplicación es un mecanismo de almacenamiento general accesible desde todas las páginas de la aplicación Web, por lo que es útil para el almacenamiento de información que deba conservarse entre recorridos de ida y vuelta del servidor y de una página a otra. Para obtener más información, vea Estado de la aplicación. Estado de aplicación es una estructura de diccionario de tipo clave-valor que se crea durante cada solución a una URL específica. Puede agregar información específica de la aplicación a esta estructura para almacenarla entre las peticiones de página. Después de agregar la información específica de la aplicación a estado de aplicación, el servidor se encarga de administrarla. Para obtener recomendaciones de uso, vea Recomendaciones de administración de estado. Estado de sesión ASP.NET permite guardar valores utilizando el estado de sesión, que es una instancia de la clase HttpSessionState para cada sesión de aplicación Web activa. (Para obtener una introducción, vea Estado de la sesión). Estado de sesión es similar a estado de aplicación, con la diferencia de que el ámbito es la actual sesión del explorador. Si hay distintos usuarios utilizando la aplicación, cada uno de ellos tendrá un estado de sesión distinto. Asimismo, si el mismo usuario deja la aplicación y vuelve más tarde, el usuario tendrá también un estado de sesión distinto. Estado de sesión tiene la estructura de un diccionario de tipo clave-valor para almacenar información específica de cada sesión que debe conservarse entre recorridos de ida y vuelta del servidor y entre solicitudes de páginas. Para obtener más información, vea Estado de la sesión. Estado de sesión permite: • • • Identificar unívocamente las peticiones del explorador o del dispositivo de cliente y asignarlas a una instancia de sesión individual en el servidor. Almacenar en el servidor datos específicos de la sesión para utilizarlos a través de múltiples peticiones del explorador o dispositivo dentro de la misma sesión. Producir eventos de administración de sesión adecuados. Adicionalmente, puede escribir código de aplicación para aprovechar estos eventos. 16 Después de agregar la información específica de la aplicación a estado de sesión, el servidor se encarga de administrar dicho objeto. En función de las opciones especificadas, la información de sesión se puede almacenar en cookies, en un servidor que no forme parte del proceso, o en un SQL Server. Para obtener recomendaciones de uso, vea Recomendaciones de administración de estado. Compatibilidad con bases de datos Es una práctica común conservar el estado utilizando tecnología de bases de datos para almacenar una gran cantidad de información específica del usuario. El almacenamiento en bases de datos es especialmente útil para conservar el estado a largo plazo, o para conservarlo aún en el caso de que se deba reiniciar el servidor. El enfoque mediante bases de datos se suele utilizar en combinación con las cookies. Por ejemplo, cuando un usuario tiene acceso por primera vez a la aplicación, puede hacer que el usuario inicie una sesión. Después, puede buscar al usuario en su base de datos y pasarle una cookie. La cookie puede contener únicamente el identificador del usuario en la base de datos (por ejemplo, un número de cliente). A continuación se puede utilizar la cookie en las solicitudes subsiguientes para buscar la información del usuario en la base de datos, según sea necesario. Nota de seguridad Puesto que las cookies pueden ser manipuladas por personas con malas intenciones, debe tener cuidado al utilizarlas para almacenar información en la que se basa la aplicación. Por ejemplo, nunca guarde información confidencial en una cookie. Si utiliza cookies para almacenar símbolos (como un id. de usuario), considere la posibilidad de cifrar el valor de la cookie o agregar lógica para estar seguro de que nadie manipula el valor de la cookie. La compatibilidad con bases de datos le permite: • • • Identificar de forma exclusiva las solicitudes del explorador o el dispositivo cliente y asignarlas a un identificador único. Mantenga el estado relacionando la información almacenada con un id. exclusivo. Puede utilizar el id. exclusivo para consultar una base de datos con el fin de obtener información relacionada con ese id. A continuación, puede modificar la información y guardarla de nuevo en la base de datos para utilizarla en varias solicitudes de las mismas páginas del sitio u otras diferentes. Producir eventos adecuados. Una condición en la base de datos puede determinar la acción del sitio. Por ejemplo, si el usuario de un sitio Commerce intenta comprar algo que no está en stock, una consulta a la base de datos puede transmitirle al sitio Web que le pida al usuario que haga otra selección. Para obtener más información acerca del uso de una base de datos para mantener el estado, vea Recomendaciones de administración de estado. 17 Contexto de página y aplicación en aplicaciones de formularios Web Forms Cuando se ejecuta una aplicación Web, ASP.NET mantiene información sobre la aplicación actual, cada sesión de usuario, la solicitud HTTP actual, la página de formularios Web Forms solicitada, etc. El marco de trabajo de páginas ASP.NET contiene una serie de clases para encapsular esta información de contexto. ASP.NET hace que instancias de estas clases estén disponibles como objetos intrínsecos a los que se puede tener acceso desde el código. La tabla siguiente enumera estos objetos intrínsecos y las clases de las que son instancias. Nota Aunque las clases que definen estos objetos son nuevas en ASP.NET, los objetos se utilizan del mismo modo que en versiones anteriores de ASP. Nombre de objeto Response Request Context Server Application Descripción Clase ASP.NET Proporciona acceso a la secuencia de HttpResponse salida de la página actual. Puede utilizar esta clase para insertar texto en la página, escribir cookies y mucho más. Para obtener información detallada, vea Page.Response (Propiedad). Proporciona acceso a la solicitud de HttpRequest página actual, incluidos los encabezados de solicitud, las cookies, el certificado de cliente, la cadena de consulta, etc. Puede utilizar esta clase para leer lo que ha enviado el servidor. Para obtener información detallada, vea Page.Request (Propiedad). Proporciona acceso a todo el contexto HttpContext actual (incluido el objeto de la solicitud). Puede utilizar esta clase para compartir información entre páginas. Expone métodos de utilidad que puede HttpServerUtility utilizar para transferir el control entre páginas, obtener información sobre el error más reciente, codificar y descodificar texto HTML, y mucho más. Proporciona acceso a métodos y eventos HttpApplicationState de aplicación para todas las sesiones. También proporciona acceso a una caché de aplicación que puede utilizar para 18 Session Trace almacenar información. Para obtener información detallada, vea Estado de la aplicación. Proporciona información de la sesión de HttpSessionState usuario actual. También proporciona acceso a una caché de sesión que puede utilizar para almacenar información, junto con los medios para controlar la administración de la sesión. Para obtener información detallada, vea Estado de sesión. Proporciona un modo de obtener TraceContext mensajes de diagnóstico de seguimiento personalizados y del sistema para mostrarlos en el resultado de la página HTTP. Para obtener información detallada, vea Funcionalidad de seguimiento ASP.NET. Los temas siguientes muestran ejemplos de cómo utilizar los objetos intrínsecos. Objeto Application Request • • • • • Temas de ejemplo Código: Leer valores de un estado de aplicación (Visual Basic) Código: Guardar valores en un estado de aplicación (Visual Basic) Código: Leer una cookie (Visual Basic) Código: Recuperar la información del explorador de un cliente (Visual Basic) Código: Escribir una cookie (Visual Basic) Server • • • • Código: Codificar texto HTML (Visual Basic) Código: Controlar errores de aplicación (Visual Basic) Código: Controlar errores de página (Visual Basic) Código: Redirigir a otra página en la misma aplicación (Visual Basic) Session • Código: Almacenar en caché un conjunto de datos en un estado de sesión (Visual Basic) Código: Leer valores de un estado de sesión (Visual Basic) Código: Guardar valores en un estado de sesión (Visual Basic) • • 19 Redirigir a los usuarios a otra página Quizá desee redirigir a los usuarios de una página de formulario Web Forms a otra. El motivo puede ser mostrar una página que coincida con la funcionalidad del explorador del usuario o que esté escrita en el idioma que el usuario habla. Existen dos formas de redirigir páginas: • • Utilizando un método de servidor. En este escenario, el servidor sólo transfiere el contexto a otra página. La ventaja es que puede compartir información de contexto de página entre páginas. El inconveniente es que el explorador del usuario no tiene conocimiento de la transferencia, por lo que no se actualiza su historial. Si el usuario actualiza la página, pueden producirse resultados inesperados. Utilizando el explorador. En este escenario, se envía un comando al explorador del usuario que da lugar a que el explorador muestre una página diferente. La ventaja es que se actualiza el historial del explorador. El inconveniente es que este escenario realiza una acción de ida y vuelta adicional que puede afectar al rendimiento. Para redirigir a los usuarios a otra página utilizando un método de servidor • • • • • • • • • • • Llame al método Server.Transfer y pásele el nombre de la página a la que desea redirigir a los usuarios. El ejemplo siguiente muestra cómo redirigir a otra página. ' Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Server.Transfer("Webform2.aspx") End Sub // C# private void Button1_Click(object sender, System.EventArgs e) { Server.Transfer("Webform2.aspx"); } Para obtener información detallada sobre el compartimiento del contexto de página durante una transferencia de servidor, vea Pasar valores entre páginas de formularios Web Forms. Para redirigir a los usuarios a otra página desde el explorador 1. Establezca la propiedad BufferOutput del objeto Response en true. 20 2. Llame al método Redirect del objeto Response, y pásele la URL de la página a la que se debe redirigir. A continuación se muestra cómo redirigir en función del contenido de una variable local, UserLanguage, cuyo valor se establece en otra parte. ' Visual Basic Response.BufferOutput = True If UserLanguage = "English" Then Response.Redirect("http://www.microsoft.com/gohere/look.htm") ElseIf UserLanguage = "Deutsch" Then Response.Redirect("http://www.microsoft.com/gohere/look_deu.htm") ElseIf UserLanguage = "Español" Then Response.Redirect("http://www.microsoft.com/gohere/look_esp.htm") End If // C# Response.BufferOutput = true; if (UserLanguage == "English") { Response.Redirect("http://www.microsoft.com/gohere/look.htm"); } else if (UserLanguage == "Deutsch") { Response.Redirect("http://www.microsoft.com/gohere/look_deu.htm"); } else if (UserLanguage == "Español") { Response.Redirect("http://www.microsoft.com/gohere/look_esp.htm"); } 21