Tutorial: Crear y registrar generadores de controladores HTTP

Actualización: noviembre 2007

La interfaz IHttpHandlerFactory crea y administra controladores HTTP para procesar las solicitudes. Por tanto, es posible crear una clase que implemente la interfaz IHttpHandlerFactory y utilizar esa clase como controlador HTTP. Esto puede permitir un mayor control sobre el procesamiento de una solicitud HTTP, ya que se asigna una dirección URL a un generador de controladores HTTP que crea controladores diferentes en función de un complejo conjunto de condiciones. Por ejemplo, con un generador de controladores HTTP puede crear un número limitado de objetos controladores HTTP que tienen acceso a recursos costosos o limitados, como conexiones de base de datos, y reutilizar después esos objetos controladores en futuras solicitudes.

En el ejemplo siguiente se utiliza un generador de controladores HTTP para crear dos controladores para recursos que se identifican con la extensión .sample: uno para una solicitud GET de HTTP y otro para una solicitud POST de HTTP. El primero es una instancia del controlador creado en Tutorial: Crear un controlador HTTP sincrónico y el segundo es una instancia del controlador creado en Cómo: Crear un controlador HTTP asincrónico.

Crear un generador de controladores HTTP personalizado

Para crear una clase de generador de controladores HTTP HandlerFactory

  1. Cree una clase denominada HelloWorldHandler en el directorio App_Code de su sitio Web.

  2. Agregue el código siguiente al archivo de clase.

    Imports System
    Imports System.Web
    
    Class HandlerFactory
        Implements IHttpHandlerFactory
    
        Public Function GetHandler(ByVal context As HttpContext, _
                ByVal requestType As String, ByVal url As [String],_ 
                ByVal pathTranslated As [String]) As IHttpHandler _
                Implements IHttpHandlerFactory.GetHandler
            Dim handlerToReturn As IHttpHandler
            Dim requestType as String = _      
                context.Request.RequestType.ToLower()
            If "get" = requestType Then
                handlerToReturn = New HelloWorldHandler()
            Else
                If "post" = requestType Then
                    handlerToReturn = New HelloWorldAsyncHandler()
                Else
                    handlerToReturn = Nothing
                End If
            End If
            Return handlerToReturn
        End Function
    
        Public Sub ReleaseHandler(ByVal handler As IHttpHandler) _
            Implements IHttpHandlerFactory.ReleaseHandler
        End Sub
    
        Public ReadOnly Property IsReusable() As Boolean
            Get
                Return False
            End Get
        End Property
    End Class
    
    using System;
    using System.Web;
    
    class HandlerFactory : IHttpHandlerFactory
    {
        public IHttpHandler GetHandler(HttpContext context, 
            string requestType, String url, String pathTranslated)
        {
            IHttpHandler handlerToReturn;
            if ("get" == context.Request.RequestType.ToLower())
            {
                handlerToReturn = new HelloWorldHandler();
            }
            else if ("post" == context.Request.RequestType.ToLower())
            {
                handlerToReturn = new HelloWorldAsyncHandler();
            }
            else
            {
                handlerToReturn = null;
            }
            return handlerToReturn;
        }
        public void ReleaseHandler(IHttpHandler handler)
        {
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
    

    El código implementa el método GetHandler de la interfaz IHttpHandlerFactory y devuelve el controlador sincrónico creado si la solicitud es una solicitud GET. Si la solicitud es una solicitud POST, devuelve la interfaz de controlador asincrónica.

Crear controladores HTTP personalizados

El generador de controladores HTTP personalizado devuelve el controlador sincrónico creado en Tutorial: Crear un controlador HTTP sincrónico o el controlador asincrónico creado en Cómo: Crear un controlador HTTP asincrónico. Debe crear tanto la clase sincrónica HelloWorldHandler como la clase asincrónica HelloWorldAsyncHandler para que el generador de controladores HTTP personalizado pueda devolver esos controladores.

Para crear las clases HelloWorldHandler y HelloWorldAsyncHandler

  1. Cree una clase denominada HelloWorldHandler en el directorio App_Code de su sitio Web.

  2. Agregue el código de Tutorial: Crear un controlador HTTP sincrónico al archivo de clase.

  3. Cree una clase denominada HelloWorldAsyncHandler en el directorio App_Code de su sitio Web.

  4. Agregue el código de Cómo: Crear un controlador HTTP asincrónico al archivo de clase.

Registrar un generador de controladores HTTP personalizado

Después de haber creado la clase de generador de controladores HTTP personalizado, debe registrarla en el archivo Web.config de su sitio Web. Esto permite a ASP.NET utilizar la clase de generador de controladores para atender las solicitudes realizadas de recursos con la extensión de nombre de archivo .sample.

Para registrar un controlador HTTP personalizado en el archivo Web.config

  1. Agregue un archivo Web.config a su sitio Web si no existe uno todavía.

  2. Agregue el siguiente elemento resaltado al archivo Web.config.

    <configuration>
      <system.web>
        <httpHandlers>      <add verb="GET,POST" path="*.sample"        type="HandlerFactory" />    </httpHandlers>
      </system.web>
    </configuration>
    

    El código registra el controlador con el nombre de clase y el nombre del controlador de HandlerFactory.

Configurar IIS 6.0 para una extensión de controlador HTTP

Servicios de Internet Information Server (IIS) pasa las solicitudes de ciertos tipos de archivo a ASP.NET para que las atienda. De forma predeterminada, los archivos que tienen extensiones como .aspx, .ascx y .asmx ya están asignados en IIS 6.0 a la extensión ISAPI de ASP.NET (Aspnet_isapi.dll). Sin embargo, si desea que ASP.NET controle las extensiones de dirección URL personalizadas, debe asignar las extensiones en IIS. Para obtener más información, vea Ciclo de vida en ASP.NET.

Para asignar la extensión de nombre de archivo .sample a ASP.NET en IIS 6.0

  1. Abra el administrador de Servicios de Internet Information Server (IIS).

  2. Haga clic con el botón secundario del mouse (ratón) en el nombre de la aplicación y, a continuación, haga clic en Propiedades.

    Nota:

    Para obtener instrucciones acerca de cómo crear una aplicación ASP.NET, vea Cómo: Crear y configurar sitios web ASP.NET locales en IIS 6.0.

  3. Haga clic en la ficha Directorio virtual y, después, haga clic en Configuración.

  4. En la ficha Asignaciones, haga clic en Agregar.

    Aparecerá el cuadro de diálogo Agregar o modificar asignación de extensión para aplicación.

  5. En el cuadro Ejecutable, escriba o vaya hasta el archivo Aspnet_isapi.dll. De forma predeterminada, el archivo está en la ubicación siguiente.

    %windows%\Microsoft.NET\Framework\version\
    
    Nota:

    Puede obtener la ruta de acceso completa y el nombre de archivo de otras asignaciones, como la asignación a archivos .aspx.

  6. En el cuadro Extensión, escriba .sample.

  7. Desactive la casilla de verificación Comprobar si el archivo existe.

  8. Haga clic en Aceptar y cierre el Administrador de IIS.

Probar el generador de controladores HTTP personalizado

Después de haber creado y registrado el generador de controladores HTTP personalizado, puede probarlo si crea una página HTML que puede solicitar un recurso cuya extensión de nombre de archivo sea .sample.

Para probar el generador de controladores HTTP personalizado

  1. Cree una página HTML (con una extensión de nombre de archivo .htm) en su aplicación.

  2. En la sección body de la página, agregue el código siguiente.

    <form action="Sample.sample" method="get">
      <input type="submit" value="Submit to Sample.sample via Get" />
    </form>
    <br />
    <form action="Sample.sample" method="post">
      <input type="submit" value="Submit to Sample.sample via Post" />
    </form>
    
  3. Solicite la página HTML en el explorador.

  4. Haga clic en uno de los botones.

    Si hace clic en el primer botón, el generador de controladores HTTP responderá a la solicitud creando y llamando a un controlador HTTP sincrónico. Si hace clic en el segundo botón, el generador de controladores HTTP responderá a la solicitud creando y llamando a un controlador HTTP asincrónico.

Vea también

Tareas

Cómo: Crear un controlador HTTP asincrónico

Tutorial: Crear un controlador HTTP sincrónico

Conceptos

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

Otros recursos

Introducción a los controladores HTTP