Marcos de Desarrollo
Diseño e implementación de aplicaciones Web con .NET
Objetivos
Conocer distintos mecanismos de gestión del estado
en aplicaciones Web [Link]
Gestión del Estado. Lado Cliente
Parámetros incluidos en la URL (<a href="…">)
Query string:
e.g. [Link]
Visibilidad elevada
Elementos de formularios ocultos (<input type="hidden")
VIEWSTATE
Cookies
Gestión del Estado. Lado Cliente: ViewState
◼ ViewState almacena estado de los controles entre una
petición y la siguiente
Todos los controles tienen la propiedad
EnableViewState (activado por defecto)
Es posible añadir datos propios al ViewState:
ViewState["Contador"] = 1;
// sintaxis alternativa
[Link]("Contador", 1);
ViewState se materializa como un campo oculto en el
HTML de salida
Gestión del Estado. Lado Cliente: Cookies
Almacenan datos en el navegador del cliente
Limitaciones
Tamaño máximo (4Kb)
Número total (~300)
Cookies por sitio web (~20)
Usuario puede bloquearlas
Gestión del Estado. Lado Cliente: Cookies
Propiedades
Domain
Servidor del que se descargó la cookie
Expires
Fecha (objeto DateTime) en la que el navegador borrará la
cookie
Name
Nombre de la cookie
Value
Contenido de la cookie
Gestión del Estado. Lado Cliente: Cookies
Creación
HttpCookie cookie =
new HttpCookie("loginName", [Link]);
[Link] = [Link](30);
[Link](cookie);
Lectura
HttpCookie cookie = [Link]["loginName"];
Borrado
HttpCookie cookie = [Link]["loginName"];
[Link] = [Link](-1);
[Link](cookie);
Gestión del Estado. Lado Cliente: Cookies
Ejemplo: Registro de la última visita
protected void Page_Load(object sender, EventArgs
e)
{
String lastVisit;
if ([Link]["lastVisit"] == null)
{
[Link] = "Welcome. This is your visit today";
first
}
else
{
lastVisit = [Link]["lastVisit"];
[Link] = "Your last visit was on "
+ [Link] + ".";
}
DateTime time = [Link];
[Link]["lastVisit"] = [Link]();
[Link]["lastVisit"].Expires =
[Link](1);
Gestión del Estado. Lado Servidor
Variables de Aplicación
Compartidas entre todas las sesiones y usuarios
Variables de Sesión
Accesibles sólo al propietario de la sesión
Requieren envío de SessionID
Gestión del Estado. Lado Servidor
Variables de Aplicación
Estado aplicación se almacena en una instancia de la
clase HttpApplicationState
Accesible a través de la propiedad [Link]
Colección pares (clave, valor)
Los valores son de tipo Object
Usar principalmente en modo lectura
Inicialización a través del fichero [Link]
Gestión del Estado. Lado Servidor
Variables de Aplicación
Ejemplo de lectura y escritura de objetos a nivel de aplicación
//Escritura
Application["Message"] = "Welcome to the this site.";
//Las variables de estado de aplicación pueden ser accedidas por
múltiples threads al mismo tiempo. Para prevenir datos inválidos,
se debe bloquear el acceso de escritura para que sólo pueda
acceder un thread
[Link]();
Application["PageRequestCount"] =
((int)Application["PageRequestCount"])+1;
[Link]();
//Lectura
if (Application["AppStartTime"] != null)
{
DateTime myAppStartTime =
(DateTime)Application["AppStartTime"];
}
Gestión del Estado. Lado Servidor
Variables de Sesión
¿Qué es una sesión?
Contexto en el que un usuario se comunica con un servidor a través de múltiples peticiones
HTTP
Problemas
HTTP es no orientado a estado (stateless)
HTTP es no orientado a sesiones (sessionless)
Concepto de sesión manejado a nivel de programación
Estado aplicación se almacena en una instancia de la clase HttpSessionState
Accesible a través de la propiedad [Link]
Colección pares (clave, valor)
Los valores son de tipo Object
Gestión del Estado. Lado Servidor
Variables de Sesión
Ejemplo de lectura y escritura de objetos en la sesión
//Escritura
Session["firstName"] =
"Pedro";
//Si se almacenan datos procedentes de un control de entrada, usar
conviene el método HtmlEncode
Session["firstName"] = [Link]([Link]);
//Sintaxis alternativa
[Link](itemName,
itemValue)
//Lectura
string firstName = Session["firstName"].ToString();
//Alternativa
string firstName = (string)(Session["firstName"]);
//Conviene asegurarse de que el valor está en la
sesión if (Session["firstName"] == null)
{
...
Gestión del Estado. Lado Servidor
Variables de Sesión
Identificador de sesión
Cadena ASCII de 120 bits
Puede almacenarse en una cookie (no persistente) generada automáticamente
(ASP.NET_SessionID)
Opcionalmente puede gestionarse a través de la propia URL
No requiere cambios en el código aplicación
Links relativos siguen funcionando
Redirecciones mediante [Link]
Genera URLs del estilo:
[Link]
Gestión del Estado. Lado Servidor
Variables de Sesión
El comportamiento puede establecerse a nivel de aplicación
([Link]), con el atributo cookieless:
"True" o "UseUri": ASP.NET_SessionID incluído en la URL
(UrlRewriting)
¡Opción recomendada para desarrollo!
"False" o "UseCookies": ASP.NET_SessionID incluído en una Cookie
"AutoDetect": las cookies se utilizarán si el navegador del cliente las
permite
<configuration>
<sessionState cookieless="UseUri" timeout="20"/>
</configuration>
Gestión del Estado. Lado Servidor
Variables de Sesión
El estado de la sesión puede almacenarse:
In-process: en memoria, en el proceso de [Link]
Out-of-process:
en un servidor de estado [Link]
en una base de datos SQL Server
fiabilidad y escalabilidad
Sobrevive a caídas proceso [Link]
Estado compartido entre máquinas de una granja
[Link]:
<sessionState inproc="false" server="serverName" port="42424" />
Gestión del Estado. Lado Servidor
Variables de Sesión
Extraído de (MacDonald, 2010)
Gestión del Estado. Lado Servidor
Variables de Sesión
Propiedades objeto Session
Count
Número de pares (clave, valor) almacenados
Keys
Conjunto de las claves almacenadas en la sesión
IsNewSession
Indica si la sesión se ha creado durante la carga de la página actual
SessionID
Identificador de sesión
Timeout
Máximo número de minutos durante los que la sesión puede permanecer inactiva
antes de ser eliminada
Tiempo por defecto: 20 minutos