Gestin de una aplicacin completa con .
NET
Servicio de Informtica
TEMA 4: FLUJO DE UNA APLICACIN
1. EVENTOS EN ASP.NET
Los eventos en ASP.NET se clasifican en tres grupos: (1) Eventos a nivel de aplicacin. Son eventos globales de nuestra web, como pueden ser el inicio de la aplicacin, finalizacin de una sesin, etc (2) Eventos a nivel de pgina. Habitualmente lanzados por el usuario, como el submit de un formulario o pulsar sobre un enlace (http://msdn.microsoft.com/eses/library/ms178472.aspx). (3) Eventos a nivel de servidor. Son los eventos propios de los controles de servidor de los Web Forms
Eventos en el ciclo de vida de una aplicacin web Una aplicacin web inicia propiamente su existencia cuando un cliente se conecta a su pgina de inicio (es el inicio de una sesin). El servidor web Internet Information Server (IIS) levanta el proceso aspnet_wp.exe (en caso de ser necesario, podra estar ya activo con el servidor dando servicio) y carga el ensamblado DLL que contiene el cdigo programado de la pgina solicitada y que se ejecuta en lado servidor. El servidor crea una instancia del Web Form solicitado, lo completa accediendo a los recursos e informacin necesarios, ejecuta la lgica de negocio y emite como respuesta ese Web Form en formato HTML al browser cliente. Tras esto, la instancia del Web Form y sus recursos son liberados de memoria.
El ciclo se repite: el usuario rellena un formulario HTML, enva los datos al servidor, ste crea un Web form, le asigna los datos enviados y procesa los eventos, enva el Web form resultante como HTML y se libera junto con sus recursos. Vemos cmo los el ciclo de vida de un Web Form es muy corto.
Tema 4 / Pgina 1
Gestin de una aplicacin completa con .NET
Servicio de Informtica
Sin embargo, la aplicacin web sigue viviendo hasta que todas las sesiones a las que est dando servicio finalizan. Tras un tiempo sin atender nuevos eventos en una sesin, el servidor destruye la sesin, y cuando no queda ninguna activa, finaliza la aplicacin web (el CLR libera de memoria los recursos de la aplicacin tales como el DLL cargado) y se lanza un evento Application_End.
Si queremos que la informacin persista entre las distintas instancias voltiles y sin estado de los Web form, podemos hacer uso de dos niveles de mbito en el servidor: Variables a nivel de aplicacin. Es un espacio global existente en todo el ciclo de vida de la aplicacin web, y accesible desde todas las sesiones a las que sta da servicio en un determinado momento. Variables a nivel de sesin. La aplicacin web tiene reservados tantos espacios de memoria reservados como sesiones tenga activas y reducidas a su mbito e inaccesibles fuera de ellas (independientes entre s).
Tema 4 / Pgina 2
Gestin de una aplicacin completa con .NET
Servicio de Informtica
(1)
Eventos de las aplicaciones y de las sesiones
La signatura de los mtodos son de la forma
protected void <nombre manejador>(object sender, EventArgs e) { }
Ejemplo:
protected void Application_Start(object sender, EventArgs e) { }
<nombre_manejador> pueden ser: Manejador de evento Application_Start Application_BeginRequest Application_EndRequest Application_End Application_AuthenticateRequest Application_Error Session_Start Session_End Accin asociada Primera visita a la pgina inicio de la aplicacin web Inicio peticin al servidor (solicitar una pgina) Fin de peticin al servidor (la pgina ya ha sido solicitada) Todas las sesiones de usuario expiran Peticin de autenticacin La aplicacin lanza un error Un nuevo usuario solicita una pgina de la aplicacin web Un usuario deja de hacer peticiones a la aplicacin web y su tiempo de sesin expira.
Los manejadores de eventos se encuentran definidos en el fichero del proyecto Global.asax: Ejemplo 1: Queremos contar el nmero de veces que el servidor recibe los eventos de un internauta. Para ello utilizamos variables de estado para almacenar objetos en memoria en sus distintos mbitos ('Application' para aplicacin y 'Session' para sesin):
void Application_Start(object sender, EventArgs e) { // Cdigo que se ejecuta al iniciarse la aplicacin Application["aplicacionesActivas"] = 0; Application["sesionesActivas"] = 0; //Incrementamos Application["aplicacionesActivas"] = (int)Application["aplicacionesActivas"] + 1; }
Tema 4 / Pgina 3
Gestin de una aplicacin completa con .NET
Servicio de Informtica
void Session_Start(object sender, EventArgs e) { // Cdigo que se ejecuta cuando se inicia una nueva sesin Application["sesionesActivas"] = (int)Application["sesionesActivas"] + 1; Response.Write("Aplicaciones activas " + Application["aplicacionesActivas"] + "<br />"); Response.Write("Sesiones activas " + Application["sesionesActivas"]); }
Ahora podemos probar:
Ejemplo 2: Vamos a probar el resto de eventos del global.aspx:
protected void Application_BeginRequest(Object sender, EventArgs e) { Response.Write("<p><b>[Aplication_BeginRequest]</b>:comienza la respuesta del navegador</p><br />"); } protected void Application_EndRequest(Object sender, EventArgs e) { Response.Write("<p><b>[Aplication_EndRequest]</b>:acaba la respuesta del navegador</p><br />"); } void Session_End(object sender, EventArgs e) { Application["sesionesActivas"] = (int)Application["sesionesActivas"] - 1; }
Tema 4 / Pgina 4
Gestin de una aplicacin completa con .NET
Servicio de Informtica
Ahora bien: dos pestaas de un mismo navegador se interpretan como dos peticiones dentro de una misma sesin (son dos instancias de un mismo browser contenedor). Por eso en la siguiente captura slo se muestran las trazas de la request y no se captura ningn evento de inicio de sesin porque sta ya la inici:
(2)
Eventos de los Web Form
Si una pgina la hemos programado con un Web Form, podemos utilizar los siguientes eventos: Manejador de evento Page_PreInit Accin asociada Se genera cuando la fase de inicio se ha completado y antes de que comience la fase de inicializacin. Utilice este evento para lo siguiente: Examine la propiedad IsPostBack para determinar si es la primera vez que se procesa la pgina. En este momento tambin se han establecido las propiedades IsCallback e IsCrossPagePostBack. Crear o volver a crear controles dinmicos. Establecer una pgina maestra de forma dinmica. Establecer la propiedad Theme de forma dinmica. Leer o establecer los valores de las propiedades de perfil.
Page_Init
El servidor crea una instancia del Web Form, carga sus controles y los inicializa con lo recibido del estado de la vista (datos del browser del cliente que vienen con la
Tema 4 / Pgina 5
Gestin de una aplicacin completa con .NET
Servicio de Informtica
request). El evento Init de controles individuales se produce antes del evento Init de la pgina. Utilice este evento para leer o inicializar las propiedades del control. Page_Load Los controles del servidor se cargan en un nuevo objeto de tipo Page. Ahora el programador puede acceder a la informacin de la vista y manejar los controles de la pgina, contenido, etc. Utilice estos eventos para controlar eventos de control especficos, como un evento Click del control Button o un evento TextChanged del control TextBox. (Ver punto siguiente) Page_PreRender El objeto Page va a renderizarse en cdigo interpretable por el browser en cuanto finalice este evento. El objeto Page genera el evento PreRender en e el objeto Page y, a continuacin, vuelve a hacer lo mismo para cada control secundario. El evento PreRender de controles individuales se produce despus del evento PreRender de la pgina. Page_Unload Page_Disposed Page_Error Page_AbortTransaction Page_CommitTransaction Page_DataBinding El objeto Page deja de ser referenciable, enciable, se destruye. destruy La memoria ocupada por Page es liberada. Evento iniciado cuando se ha producido una excepcin no capturada. Una operacin transaccional ha sido finalizada sin llegar a su fin. La transaccin se ha completado con xito. Un control de servidor se ha conectado a una fuente de datos.
Eventos de control
Tema 4 / Pgina 6
Gestin de una aplicacin completa con .NET
Servicio de Informtica
Ejemplo:
public partial class _Default : System.Web.UI.Page { protected void Page_PreInit(object sender, EventArgs e) { Response.Write("<b>[Page_PreInit]</b>"); if (Page.IsPostBack) Response.Write(Request.Form["TextBox1"] + "<br />"); } protected void Page_Init(object sender, EventArgs e) { Response.Write("<b>[Page_Init]</b><br />"); TextBox1.Text = "Page_init"; } protected void Page_Load(object sender, EventArgs e) { Response.Write("<b>[Page_Load]</b><br />"); } protected void Page_PreRender(object sender, EventArgs e) { Response.Write("<b>[Page_PreRender]</b><br />"); } }
(3)
Eventos de los controles de servidor
Grupos de eventos de los controles: Eventos de envo. Son los eventos lanzados por controles que emiten un envo (post) al servidor de manera inmediata para procesar el Web Form. Por ejemplo al enviar un formulario pulsando sobre el botn de aceptacin. Estos controles son: Button, Link Button e Image Button. Eventos de cach. Estos eventos se producen en la vista y sern procesados en el servidor cuando se enve la informacin mediante un evento de envo. Por ejemplo el seleccionar un elemento de una lista provoca un cambio de estado de la misma que luego, en servidor, podremos obtener. Controles con eventos de cach son TextBox, DropDownList, CheckBox.
Tema 4 / Pgina 7
Gestin de una aplicacin completa con .NET
Servicio de Informtica
Eventos de validacin. Son los eventos que se procesan dentro de la pgina web. Por ejemplo que la entrada sea obligatoria.
En el ciclo de vida de un Web Form se aplica el siguiente algoritmo de manejo de eventos: 1. Los controles con validacin hacen las validaciones en el propio cliente antes de que la pgina sea enviada al servidor (se ha tenido que producir un evento de envo previamente). 2. La pgina se enva y se suceden los eventos Page_Init y Page_Load. Se procesan los eventos cacheados por orden temporal y finalmente se procesa el evento de envo. 3. Nuestra lgica de negocio realiza las acciones pertinentes con los controles.
Insertamos este cdigo en nuestro default.aspx de pruebas:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"><title>Pgina sin ttulo</title></head> <body> <form id="form1" runat="server"> <div> <asp:Label ID="Label1" runat="server" Text="Nombre" AssociatedControlID="TextBoxNombre"></asp:Label> <asp:TextBox ID="TextBoxNombre" runat="server" ontextchanged="TextBoxNombre_TextChanged" onload="TextBoxNombre_Load" onprerender="TextBoxNombre_PreRender"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
Tema 4 / Pgina 8
Gestin de una aplicacin completa con .NET
Servicio de Informtica
ErrorMessage="Introduce el nombre" ControlToValidate="TextBoxNombre"> </asp:RequiredFieldValidator> <asp:Button ID="Button1" runat="server" Text="Enviar" onclick="Button1_Click" /> </div> </form> </body> </html>
using System; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.Write("[Page_Load] " + TextBoxNombre.Text + "<br />"); } protected void Button1_Click(object sender, EventArgs e) { Response.Write("[Servidor] Click en el botn " + TextBoxNombre.Text + "<br />"); } protected void TextBoxNombre_TextChanged(object sender, EventArgs e) { Response.Write("[Servidor] Texto cambiado "+ TextBoxNombre.Text+"<br />"); } protected void TextBoxNombre_Load(object sender, EventArgs e) { Response.Write("[Servidor] Control cargado " + TextBoxNombre.Text + "<br />"); } protected void TextBoxNombre_PreRender(object sender, EventArgs e) { Response.Write("[Servidor] Control pre Renderizado " + TextBoxNombre.Text + "<br />"); } }
Pulsamos del botn Enviar con el campo obligatorio vaco y el propio navegador gestiona los eventos de validacin y se omite la request:
Tema 4 / Pgina 9
Gestin de una aplicacin completa con .NET
Servicio de Informtica
Si introducimos valor en el campo podemos: mostrar el orden en el que el servidor maneja los eventos del Web Form:
Tema 4 / Pgina 10
Gestin de una aplicacin completa con .NET
Servicio de Informtica
2.
TRAZA EN ASP.NET
Definicin: Se puede utilizar la traza para hacer un seguimiento del flujo de ejecucin de una aplicacin, mostrar datos en puntos crticos del ciclo de vida de un formulario Web Forms y detectar cmo interactan los formularios Web Forms con otros componentes de la aplicacin. Mediante la traza puede examinar los parmetros de solicitud HTTP que se envan a su aplicacin, cunta memoria se est almacenando en el estado de vista para un formulario Web Forms determinado y otra informacin til para la generacin de perfiles. Funcionamiento: En la directiva page se aade Trace = true <%Page
Language="C#" AutoEventWireup="true" CodeFile="formulario_nuevo_usuario_principal.aspx.cs" Inherits="_Default" MasterPageFile="~/MasterPage.master" Trace="true" %>
Se pueden crear declaraciones de seguimiento en lugares estratgicos del objeto trace de la pginas. Para eso usamos Trace.Write / Trace.Warn. La diferencia est en que el primero pintar en negro y el segundo en rojo. Se puede observar en la traza de la pgina siguiente como se ha puesto en Page_Load un Trace.Warn.
protected void Page_Load(object sender, EventArgs e) { Trace.Warn("Page_Load"); }
Tambin se destaca la aparicin de nuevos eventos de flujo cuando se hace postback.
Tema 4 / Pgina 11
Gestin de una aplicacin completa con .NET
Servicio de Informtica
3.
ENLACES EN INTERNET
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=eventosASPNET http://msdn.microsoft.com/es-es/library/ms178472.aspx
Tema 4 / Pgina 12