IHttpModule: Antes y después de la solicitud

30. January 2010 14:23 by Oscar.SS in Desarrollo .NET, Desarrollo Web  //  Tags: ,   //   Comments (0)

La interfaz IHttpModule nos proporciona una manera simple de manejar las peticiones HTTP antes de que estas comiencen a administrarse en IIS y una vez que han sido totalmente ejecutadas y se van a devolver al cliente.

¿Porque razón querríamos actuar en la solicitud antes (y después) de que comience a administrarse? 

  • Por temas de seguridad y rendimiento. Si un usuario no tiene permisos en nuestra aplicación es mejor denegarle el acceso antes de que su solicitud comience a consumir recursos en el servidor.  Comprobamos que no tiene premisos antes del comienzo de ejecución de ninguno de los eventos del ciclo de vida de la página solicitada (o control de usuario, o servicio Web).
  • Para crear módulos estadísticos sobre las solicitudes de forma global en lugar de hacerlo para las páginas de forma individual.
  • Incluir en la respuesta a la solicitud, encabezados y pies de páginas personalizados para todas las solicitudes.
  • En general, siempre que deseemos actuar antes de que comience a ejecutarse la solicitud en el servidor y justo antes de que se envíe la respuesta al cliente.
 
 
 
La forma de implementar un módulo es muy sencilla. Solo tenemos que crear un archivo de clase, por ejemplo Modulo.cs, y implementar la interfaz IHttpModule. Los miembros de esta interfaz son solo dos. 
  • Init(). Inicializa el módulo y lo prepara para procesar la solicitud HTTP.
  • Disponse(). Elimina los recursos utilizados por el módulo.
Es evidente que la lógica de nuestro módulo deberá implementarse en el método Init(). A continuación podemos ver un sencillo ejemplo que comprueba si el usuario tiene permisos, en caso negativo es transferido a una página en la que se muestra un mensaje.
 
public class ClaseModulo : IHttpModule
{
    
public ClaseModulo(){}

    
public void Dispose() { }

    
public string NombreModulo 
    {
        
get return "MiModulo"}
    }

    
public void Init(HttpApplication aplicacion)
    {
        
/*
         * Definimos los eventos del ciclo de vida de la aplicación sobre los que vamos actuar.
         * En este caso actuamos antes del comienzo de la solicitud y cuando esta termina.
         */
        
aplicacion.BeginRequest += new EventHandler(aplicacion_BeginRequest);
        
aplicacion.EndRequest += new EventHandler(aplicacion_EndRequest);
    
}

    
private void aplicacion_BeginRequest(object sender, EventArgs e)
    {
        
//Obtenemos el contexto de aplicación de la solicitud.
        
HttpApplication Aplicacion (HttpApplication)sender;
        
HttpContext Contexto Aplicacion.Context;

        
//Obtenemos la extensión del archivo solicitado.
        
string Ruta Contexto.Request.FilePath;
        string 
Extension VirtualPathUtility.GetExtension(Ruta);

       
//Si se ha solicitado una página aspx.
        
if (Extension.Equals(".aspx"))
        {
            
//Si el usuario no tiene permisos le enviamos a la página de error.
            
if (!UserTienePermisos())
            {
                Contexto.Server.Transfer(
"Default2.aspx");
            
}
        }
    }

    
private void aplicacion_EndRequest(object sender, EventArgs e)
    {
        
//Obtenemos el contexto de aplicación de la solicitud
        
HttpApplication Aplicacion (HttpApplication)sender;
        
HttpContext Contexto Aplicacion.Context;

        
//Obtenemos el nombre del archivo solicitado.
        
string Ruta Contexto.Request.FilePath;
        string 
Extension VirtualPathUtility.GetExtension(Ruta);

        if 
(Extension.Equals(".aspx"))
        {
            
//Si el usuario no tiene permisos mostramos un mensaje al final de la solicitud.
            
if (!UserTienePermisos())
            {
                Contexto.Response.Write(
"Usted no tiene permisos");
            
}
        }
    }
}
 
Una vez codificada la lógica de nuestro módulo debemos registrarlo en el web.config para ASP.NET tenga en cuenta como tiene que manejar la solicitud.
        <system.web>
            
<httpModules>
                
<add name="MiModulo" type="ClaseModulo"/>
            </
httpModules>
        
</system.web>

Recent Comments

Comment RSS

Month List