Tutorial: Crear y registrar un módulo HTTP personalizado

Actualización: noviembre 2007

Este tutorial muestra la funcionalidad básica de un módulo HTTP personalizado. En cada solicitud se llama a un módulo HTTP como respuesta a los eventos BeginRequest y EndRequest. Como resultado, el módulo se ejecuta antes y después de que se procese una solicitud.

Si la aplicación ASP.NET se ejecuta en IIS 6.0, puede utilizar los módulos HTTP para personalizar las solicitudes a los recursos que atiende ASP.NET. Esto incluye las páginas web ASP.NET (archivos .aspx), servicios web (archivos .asmx), controladores ASP.NET (archivos .ashx) y cualquier tipo de archivo que haya asignado a ASP.NET. Si la aplicación ASP.NET se ejecuta en IIS 7.0, puede utilizar los módulos HTTP para personalizar las solicitudes a cualquier recurso que atienda IIS. Esto incluye no solo los recursos de ASP.NET, sino también los archivos HTML (archivos .htm o .html), archivos gráficos, etc. Para obtener más información, vea Información general sobre el ciclo de vida de una aplicación ASP.NET para IIS 5.0 y 6.0 y Información general sobre el ciclo de vida de una aplicación ASP.NET para IIS 7.0.

El módulo de ejemplo de este tema agrega al principio de cualquier solicitud HTTP un mensaje a la página web ASP.NET solicitada. Agrega otro mensaje una vez procesada la página. El módulo incluye código que se asegura de que no agrega texto a una solicitud a cualquier otro tipo de archivo.

Cada controlador de eventos se escribe como un método privado del módulo. Cuando se provocan los eventos registrados, ASP.NET llama al controlador adecuado del módulo, que escribe información en la página web ASP.NET.

Las tareas ilustradas en este tutorial incluyen lo siguiente:

  • Cómo crear el código para un módulo HTTP.

  • Cómo registrar el módulo en el archivo Web.config.

Requisitos previos

Para poder completar este tutorial, necesitará:

  • Visual Studio o Visual Web Developer.

El tutorial también supone que está trabajando con IIS 6.0 o IIS 7.0. Sin embargo, puede ver la funcionalidad del módulo incluso si ejecuta el servidor de desarrollo de ASP.NET.

Crear una clase de módulo HTTP personalizado

Para comenzar, creará un archivo de clase que implemente el módulo.

Para crear una clase de módulos HTTP personalizados

  1. Cree un sitio de ASP.NET Web y denomínelo Controlador.

    Nota:

    Puede elegir cualquier nombre para el sitio web.

  2. Si aún no tiene una carpeta App_Code en el sitio web, créela bajo la raíz del sitio.

  3. En el directorio App_Code, cree un archivo de clase con el nombre HelloWorldModule.vb (para Visual Basic) o HelloWorldModule.cs (para C#).

    Nota:

    Si utiliza Visual Studio (no Visual Web Developer Express), también puede crear HelloWorldModule como un proyecto de bibliotecas de clase, compilarlo y colocar el ensamblado resultante en el directorio bin de la aplicación web.

  4. Agregue el siguiente código al archivo de clase:

    Imports Microsoft.VisualBasic
    Imports System.Web
    
    Public Class HelloWorldModule
        Implements IHttpModule
    
        Public Sub New()
        End Sub
    
        Public ReadOnly Property ModuleName() As String
            Get
                Return "HelloWorldModule"
            End Get
        End Property
    
        ' In the Init function, register for HttpApplication 
        ' events by adding your handlers. 
        Public Sub Init(ByVal application As HttpApplication) _
                Implements IHttpModule.Init
            AddHandler application.BeginRequest, _
                AddressOf Me.Application_BeginRequest
            AddHandler application.EndRequest, _
                AddressOf Me.Application_EndRequest
        End Sub
    
        Private Sub Application_BeginRequest(ByVal source As Object, _
                 ByVal e As EventArgs)
            ' Create HttpApplication and HttpContext objects to access 
            ' request and response properties. 
            Dim application As HttpApplication = DirectCast(source, _
                HttpApplication)
            Dim context As HttpContext = application.Context
            Dim filePath As String = context.Request.FilePath
            Dim fileExtension As String = _
                VirtualPathUtility.GetExtension(filePath)
            If fileExtension.Equals(".aspx") Then
                context.Response.Write("<h1><font color=red>" & _
                    "HelloWorldModule: Beginning of Request" & _
                    "</font></h1><hr>")
            End If
        End Sub
    
        Private Sub Application_EndRequest(ByVal source As Object, _
            ByVal e As EventArgs)
            Dim application As HttpApplication = DirectCast(source, _
                HttpApplication)
            Dim context As HttpContext = application.Context
            Dim filePath As String = context.Request.FilePath
            Dim fileExtension As String = _
                VirtualPathUtility.GetExtension(filePath)
            If fileExtension.Equals(".aspx") Then
                context.Response.Write("<hr><h1><font color=red>" & _
                    "HelloWorldModule: End of Request</font></h1>")
            End If
        End Sub
    
        Public Sub Dispose() Implements System.Web.IHttpModule.Dispose
        End Sub
    
    End Class
    
    using System;
    using System.Web;
    public class HelloWorldModule : IHttpModule
    {
        public HelloWorldModule()
        {
        }
    
        public String ModuleName
        {
            get { return "HelloWorldModule"; }
        }
    
        // In the Init function, register for HttpApplication 
        // events by adding your handlers.
        public void Init(HttpApplication application)
        {
            application.BeginRequest += 
                (new EventHandler(this.Application_BeginRequest));
            application.EndRequest += 
                (new EventHandler(this.Application_EndRequest));
        }
    
        private void Application_BeginRequest(Object source, 
             EventArgs e)
        {
        // Create HttpApplication and HttpContext objects to access
        // request and response properties.
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;
            string filePath = context.Request.FilePath;
            string fileExtension = 
                VirtualPathUtility.GetExtension(filePath);
            if (fileExtension.Equals(".aspx"))
            {
                context.Response.Write("<h1><font color=red>" +
                    "HelloWorldModule: Beginning of Request" +
                    "</font></h1><hr>");
            }
        }
    
        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;
            string filePath = context.Request.FilePath;
            string fileExtension = 
                VirtualPathUtility.GetExtension(filePath);
            if (fileExtension.Equals(".aspx"))
            {
                context.Response.Write("<hr><h1><font color=red>" +
                    "HelloWorldModule: End of Request</font></h1>");
            }
        }
    
        public void Dispose() { }
    }
    
  5. Guarde y cierre el archivo de clase.

  6. En el menú Generar, haga clic en Generar sitio web.

    Si el sitio web no se genera, corrija los problemas que puedan existir. El módulo HTTP personalizado se debe compilar o no podrá registrarlo.

Registrar el módulo HTTP en IIS 6.0 y en el modo clásico de IIS 7.0

Después de crear la clase HelloWorldModule, puede registrar el módulo mediante la creación de una entrada en el archivo Web.config. El registro del módulo HTTP permite suscribirlo a las notificaciones de la canalización de solicitudes.

En IIS 7.0, una aplicación se puede ejecutar en modo clásico o integrado. En modo clásico, las solicitudes se procesan básicamente de la misma forma que en IIS 6.0. En modo integrado, IIS 7.0 administra las solicitudes mediante una canalización que le permite compartir solicitudes, módulos y otras características con ASP.NET.

El procedimiento para registrar un módulo es diferente en el modo clásico de IIS 7.0 y en el modo integrado de IIS 7.0. En esta sección se describe el procedimiento para IIS 6.0 y para el modo clásico de IIS 7.0. El procedimiento para registrar un módulo que se ejecuta en el modo integrado de IIS 7.0 se describe en la sección siguiente.

Para registrar el módulo para IIS 6.0 y para el modo clásico de IIS 7.0

  1. Si aún no hay un archivo web.config en el sitio web, créelo bajo la raíz del sitio.

  2. Agregue el siguiente código resaltado al archivo Web.config:

    <configuration>
      <system.web>
        <httpModules>      <add name="HelloWorldModule" type="HelloWorldModule"/>     </httpModules>
      </system.web>
    </configuration>
    

    El código registra el módulo con el nombre de la clase y el nombre del módulo de HelloWorldModule:

Registrar el módulo HTTP en el modo integrado de IIS 7.0

El proceso para registrar un módulo en el modo integrado de IIS 7.0 es ligeramente diferente que el proceso para el modo clásico de IIS 7.0.

Para registrar el módulo en el modo integrado de IIS 7.0

  1. Si aún no hay un archivo web.config en el sitio web, créelo bajo la raíz del sitio.

  2. Agregue el siguiente código resaltado al archivo Web.config:

    <configuration>
      <system.webServer>    <modules>      <add name="HelloWorldModule" type="HelloWorldModule"/>    </modules>  </system.webServer>
    </configuration>
    
    Nota:

    También puede registrar el módulo con IIS Manager. Para obtener más información, vea Configuring Modules in IIS 7.0.

    El código registra el módulo con el nombre de la clase y el nombre del módulo de HelloWorldModule:

Probar el módulo HTTP personalizado

Después de crear y registrar el módulo HTTP personalizado, puede probarlo.

Para probar el módulo HTTP personalizado

  1. Agregue una nueva página web ASP.NET a la aplicación.

  2. Haga clic con el botón secundario en la página agregada y seleccione Ver en el explorador.

    El módulo HTTP anexa una cadena al principio y al final de la respuesta. El módulo se ejecuta automáticamente durante cualquier solicitud a un archivo cuya extensión esté asignada a ASP.NET. Para obtener más información, vea Información general sobre controladores HTTP y módulos HTTP.

Vea también

Conceptos

Información general sobre el ciclo de vida de una aplicación ASP.NET para IIS 5.0 y 6.0