Global.asax

Trabajando con el nuevo Global.asax

 

Fecha: 16/Jun/2005 (14 de Junio de 2005)
Autor: Kevin Guisbert Segales (guisbertkevin@gmail.com)

 


Introducción

Hola a tod@s, en esta oportunidad vamos a hablar un poco del nuevo global.asax que nos ofrece ASP.NET, primero los que ya trabajaron con el clasico ASP conocen el archivo Global.asa con el cual podiamos realizar procedimientos generales, en cierta forma usar variables globales a nivel aplicacion, etc. para los que no lo conocian pues ya lo conocen :P bueno resumiendo el global asa nos permitia en cierta forma configurar nuestra aplicacion, manegar eventos de nuestra aplicacion, etc. Pero acaso eso es todo... pues no el anterior global.asa a pesar que nos era de mucha utilidad estaba limitado, pero tal limitacion ya no existe en el nuevo modelo de una aplicacion ASP.NET el cual ahora se llama Global.asax.

El nuevo Global.asax nos porvee de muchas mas opciones para manejar nuestra aplicacion, pero OJO que el Global.asax ya no se lo utiliza para funciones de configuracion (que el trabajo de configuracion se lo paso al Web.Config) asi que tenemos que acostumbrarnos a este nuevo modelo que obiamente es mas ordenado. Bueno para no aburrirlos mas y que luego ya no leean mas mis publicaciones(espero que esta no sea la unica :) jeje) vamos al grano, les presentare una plantilla en la cual estan las opciones que nos ofrece el Global.asax no necesariamente deben estar presente todas estas solo las que necesites(todo el siguiente codigo va dentro del Global.asax, por si acaso :p).

'/----------/
'/ I. START /
'/----------/
Sub Application_OnStart(ByVal sender As Object, ByVal e As EventArgs)
    'Ocurre cuando se realiza la primera solicitud a la aplicacion, 
    'solo se inicia una vez(la primera) durante la vida util de la aplicacion
    Context.Response.Write("<b>I. Iniciando aplicacion</b><br />")
End Sub
'/---------/
'/ II. END /
'/---------/
Sub Application_OnEnd(ByVal sender As Object, ByVal e As EventArgs)
    'Ocurre cuando la aplicacion termina
    Context.Response.Write("<b>II. Terminando aplicacion</b><br />")
End Sub
'/--------------------/
'/ III. SESSION START / 
'/--------------------/
Sub Session_OnStart(ByVal sender As Object, ByVal e As EventArgs)
    'Ocurre cuando se crea una nueva session, es decir cuando un usuario ingresa
    Context.Response.Write("<b>III. Session iniciada</b><br />")
End Sub
'/-----------------/
'/ IV. SESSION END /
'/-----------------/
Sub Session_OnEnd(ByVal sender As Object, ByVal e As EventArgs)
    'Ocurre cuando se abandona una session o se supera el tiempo de espera de una session
    Context.Response.Write("<b>IV. Session finalizada</b><br />")
End Sub
'/----------------------/
'/ V. APPLICATION ERROR /
'/----------------------/
Sub Application_OnError(ByVal sender As Object, ByVal e As EventArgs)
    'Cuando se da un error en la aplicacion
    Context.Response.Write("<b>V. ERROR, pero aca podemos hacer algo al respecto</b><br />")
End Sub
'/--------------------------/
'/ VI. APPLICATION DISPOSED /
'/--------------------------/
Sub Application_OnDisposed(ByVal sender As Object, ByVal e As EventArgs)
    'Cuando la aplicacion es apagada y el CLR la remueve de memoria
    Context.Response.Write("<b>VI. Aplicacion apagada</b><br />")
End Sub
'/------------------/
'/ 1. BEGIN REQUEST /
'/------------------/
Sub Application_OnBeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    'Ocurre al Request y se ejecuta entes que cualquier manejador u otro evento
    Response.Write("1. Aca el que tiene mayor prioridad :) a excepcion del Application_OnStart :( <br />")
End Sub
'/-------------------------/
'/ 2. AUTHENTICATE REQUEST /
'/-------------------------/
Sub Application_OnAuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
    'Ocurre al verificar si un usuario tiene permisos
    Response.Write("2. Verificando si el usuario tiene permisos :S <br />")
End Sub
'/----------------------/
'/ 3. AUTHORIZE REQUEST /
'/----------------------/
Sub Application_OnAuthorizeRequest(ByVal sender As Object, ByVal e As EventArgs)
    'Aca se autoriza al usuario a un recurso, tambien podemos colocar un nivel de acceso al usuario
    Response.Write("3. Aca autorizamos acceso y podemos colocar nivel de acceso al usuario, esto lo puedes ver en articulos de autenticación<br />")
End Sub
'/-------------------------/
'/ 4. RESOLVE REQUESTCACHE /
'/-------------------------/
Sub Application_OnResolveRequestCache(ByVal sender As Object, ByVal e As EventArgs)
    'Aca ASP.NET determina si el request sera servido desde cache 
    Response.Write("4. Aca se decide si el pedido sera servido desde output cache....<br />")
End Sub
'/--------------------------/
'/ 5. ACQUIRE REQUEST STATE /
'/--------------------------/
Sub Application_OnAcquireRequestState(ByVal sender As Object, ByVal e As EventArgs)
    'Aca ASP.NET esta puede verificar el estado de la session
    Response.Write("5. Aca obtenemos el estado de la session<br />")
End Sub
'/--------------------------------/
'/ 6. PRE REQUEST HANDLER EXECUTE /
'/--------------------------------/
Sub Application_OnPreRequestHandlerExecute(ByVal sender As Object, ByVal e As EventArgs)
    'Este evento sucede antes que el manejador HTTP tome el control
    Response.Write("6. Ultima oportunidad de hacer algo antes de que el manejador HTTP tome el control<br />")
End Sub

'/****************************/
'/* TURNO DEL MANEJADOR HTTP */
'/****************************/

'/---------------------------------/
'/ 7. POST REQUEST HANDLER EXECUTE /
'/---------------------------------/
Sub Application_OnPostRequestHandlerExecute(ByVal sender As Object, ByVal e As EventArgs)
    'Este evento se da despues de que el manejador HTTP termina de ejecutarse
    Response.Write("7. Aca el manejador ya termino su labor<br />")
End Sub
'/--------------------------/
'/ 8. RELEASE REQUEST STATE /
'/--------------------------/
Sub Application_OnReleaseRequestState(ByVal sender As Object, ByVal e As EventArgs)
    'Aca se suelta los datos de la session y se actualiza si es necesario, luego no es posible actualizar datos de la session
    Response.Write("8. Si quieres modificar los datos de la session aca es la ultima oportunidad<br />")
End Sub
'/-------------------------/
'/ 9. UPDATE REQUEST CACHE /
'/-------------------------/
Sub Application_OnUpdateRequestCache(ByVal sender As Object, ByVal e As EventArgs)
    'Aca se actualiza el Output Cache que se uso en el request actual
    Response.Write("9. Actualizando el Output Cache...<br />")
End Sub
'/-----------------/
'/ 10. END REQUEST /
'/-----------------/
Sub Application_OnEndRequest(ByVal sender As Object, ByVal e As EventArgs)
    'Aca ya estamos listos para enviar las cbeceras HTTP y el documento en si
    Response.Write("10. Listos para enviar el contenido al usuario, revisa que no te olvides nada<br />")
End Sub
'Nota.- Estos dos ultimos no tienen un order determinado

'/------------------------------/
'/ 11. PRE SEND REQUEST HEADERS /
'/------------------------------/
Sub Application_OnPreSendRequestHeaders(ByVal sender As Object, ByVal e As EventArgs)
    'Aca podemos hacer algo antes de confirmar las cabeceras a enviar
    Response.Write("11. Confirmado cabeceras<br />")
End Sub
'/------------------------------/
'/ 12. PRE SEND REQUEST CONTENT /
'/------------------------------/
Sub Application_OnPreSendRequestContent(ByVal sender As Object, ByVal e As EventArgs)
    'Aca colocamos algo mas antes de confirmar el contenido de la peticion
    Context.Response.Write("12. Confirmando contenido<br />")
End Sub

Como pudieron ver dividi el contenido en dos partes las primera enumere con numeros romanos y las siguientes de forma normal, las con numeros romanos algunas ya las teniamos cuando usabamos el Global.asa, las siguientes son nuevas del Global.asax.

Ahora sin tiempo que perder apliquemos el uso del Global.asax, el siguiente codigo maneja algunos de los eventos que ofrece el Global.asax en este caso se ve cuantos usuarios estan conectados, tambien manejamos el control de errores pero este manejo de errores que coloque solo funciona en Windows 2000 (lo coloque para fines didacticos :p) Ok, lo demas corre sin problemas.

'/----------/
'/ I. START /
'/----------/
Sub Application_OnStart(ByVal sender As Object, ByVal e As EventArgs)
    'Aca inicializamos una variable para contar usuarios activos
    Application("NumUsers") = 0
End Sub
'/--------------------/
'/ III. SESSION START / 
'/--------------------/
Sub Session_OnStart(ByVal sender As Object, ByVal e As EventArgs)
    'Aca podemos incrementar la variable que contiene el numero de usuarios activos
    Application("NumUsers") += 1
End Sub
'/-----------------/
'/ IV. SESSION END /
'/-----------------/
Sub Session_OnEnd(ByVal sender As Object, ByVal e As EventArgs)
    'Aca podemos decrementar la variable que contiene el numero de usuarios activos
    Application("NumUsers") -= 1
End Sub
'/----------------------/
'/ V. APPLICATION ERROR /
'/----------------------/
Sub Application_OnError(ByVal sender As Object, ByVal e As EventArgs)
    'Ejemplo para crear un EventLog SOLO en Windows 2000
    'OJO SOLO WIN 2000 despues no me hechen la culpa de nada OK :P
    'Capturamos el error y lo convertimos a cadena
    Dim UltimoError As Exception = Server.GetLastError()
    Dim MensajeError As String = UltimoError.ToString()

    Dim LogName As String = "MyLogError"
    Dim Message As String = "Url " & Request.Path & " Error: " & MensajeError

    'Creamos el EventLog
    If (Not EventLog.SourceExists(LogName)) Then
        EventLog.CreateEventSource(LogName, LogName)
    End If

    Dim Log As New EventLog
    Log.Source = LogName

    'Aca escogemos una de cinco opciones para el icono 
    Log.WriteEntry(Message, EventLogEntryType.Information, 1)
    ' Log.WriteEntry(Message, EventLogEntryType.Error, 2) 
    ' Log.WriteEntry(Message, EventLogEntryType.Warning, 3) 
    ' Log.WriteEntry(Message, EventLogEntryType.SuccessAudit, 4) 
    ' Log.WriteEntry(Message, EventLogEntryType.FailureAudit, 5) 
End Sub
'/------------------/
'/ 1. BEGIN REQUEST /
'/------------------/
Sub Application_OnBeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    Dim s As String = ""
    s = "<table border='1' cellpadding='0' cellpadding='0' width='100%'><tr><td width='100%' align='center'>Cabecera :)</td></tr></table>"
    Response.Write(s)
End Sub

'/****************************/
'/* TURNO DEL MANEJADOR HTTP */
'/****************************/

'/-----------------/
'/ 10. END REQUEST /
'/-----------------/
Sub Application_OnEndRequest(ByVal sender As Object, ByVal e As EventArgs)
    Dim s As String = ""
    s = "<table border='1' cellpadding='0' cellpadding='0' width='100%'><tr><td width='100%' align='center'>Pie de Pagina :P <br />Hay <b>" & Application("NumUsers") & "</b> conectados</td></tr></table>"
    Response.Write(s)
End Sub

Como pudiste ver solo use lo que necesitaba, ahora el poder del Global.asax esta en como lo implementes en tu aplicacion, por ejemplo al iniciar la aplicacion (Application_OnStart) podrias colocar timer(creas un procedimiento en el mismo Global.asax y lo llamas desde este evento) y cada cierto tiempo se puede ver si un web service tiene nuevos contenidos, tambien podrias usar un inicio de session para validar el lenguage que usa el usuario y configurar la navegacion para que se adapte al lenguage de este usuario(claro si tu aplicacion fuera multiidioma), etc. En fin hay un monton de cosas en las que te puede ayudar el nuevo Global.asax, bueno me despido hasta la proxima.


Espacios de nombres usados en el código de este artículo:

System.Diagnostics
System.Web
System.Web.SessionState

 


Fichero con el código de ejemplo: Kev_Global.zip - 20 KB


ir al índice