Download - Marcos de Desarrollo - UDC
Marcos de DesarrolloDiseño e implementación de aplicaciones Web con .NET
Objetivos
Conocer distintos mecanismos de gestión del estado en aplicaciones Web ASP.NET
Gestión del Estado. Lado Cliente Parámetros incluidos en la URL (<a href="…">)
Query string:
e.g. http://www.google.com/search?q=asp.net 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 se materializa como un campo oculto en el HTML de salida
ViewState["Contador"] = 1;
// sintaxis alternativa
ViewState.Add("Contador", 1);
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", UserProfile.LoginName);
cookie.Expires = DateTime.Now.AddDays(30);
Response.Cookies.Add(cookie);
Lectura
HttpCookie cookie = Request.Cookies["loginName"];
Borrado
HttpCookie cookie = Request.Cookies["loginName"];
cookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(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 (Request.Cookies["lastVisit"] == null)
{
lblWelcome.Text = "Welcome. This is your first visit today";
}
else
{
lastVisit = Request.Cookies["lastVisit"];
lblWelcome.Text = "Your last visit was on " +
lastVisit.Value + ".";
}
DateTime time = DateTime.Now;
Response.Cookies["lastVisit"] = time.ToString();
Response.Cookies["lastVisit"].Expires = time.AddDays(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 ServidorVariables de Aplicación Estado aplicación se almacena en una instancia de la
clase HttpApplicationState
Accesible a través de la propiedad Page.Application Colección pares (clave, valor)
Los valores son de tipo Object
Usar principalmente en modo lectura
Inicialización a través del fichero Global.asax
Gestión del Estado. Lado ServidorVariables 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
Application.Lock();
Application["PageRequestCount"] =
((int)Application["PageRequestCount"])+1;
Application.UnLock();
//Lectura
if (Application["AppStartTime"] != null)
{
DateTime myAppStartTime =
(DateTime)Application["AppStartTime"];
}
Gestión del Estado. Lado ServidorVariables 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 Page.Session Colección pares (clave, valor)
Los valores son de tipo Object
Gestión del Estado. Lado ServidorVariables 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, conviene usar
el método HtmlEncode
Session["firstName"] = Server.HtmlEncode(firstNameTextBox.Text);
//Sintaxis alternativa
Session.Add(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 ServidorVariables 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 Response.ApplyAppPathModifier
Genera URLs del estilo:
http://server/site/(uqwfp455t2qav155)/default.aspx
Gestión del Estado. Lado ServidorVariables de Sesión El comportamiento puede establecerse a nivel de aplicación
(Web.Config), 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 laspermite
<configuration>
<sessionState cookieless="UseUri" timeout="20"/>
</configuration>
Gestión del Estado. Lado ServidorVariables de Sesión El estado de la sesión puede almacenarse:
In-process: en memoria, en el proceso de ASP.NET
Out-of-process: en un servidor de estado ASP.NET en una base de datos SQL Server fiabilidad y escalabilidad
Sobrevive a caídas proceso ASP.NET Estado compartido entre máquinas de una granja
Web.config:
<sessionState inproc="false" server="serverName" port="42424" />
Gestión del Estado. Lado ServidorVariables de Sesión
Extraído de (MacDonald, 2010)
Gestión del Estado. Lado ServidorVariables 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
Bibliografía Recomendada:
M. MacDonald, A. Freeman, M. Szpuszta. Pro ASP.Net4 in C# 2010. 4th Ed. Apress. 2010.