Cómo trabajar con HttpModules en ASP.NET

Hay dos formas en las que puede inyectar lógica en la canalización de solicitudes de una aplicación ASP.NET: HttpHandlers y HttpModules. Un HttpModule es un componente que forma parte de la canalización de procesamiento de solicitudes de ASP.NET y se llama en cada solicitud que se realiza a su aplicación.

Tenga en cuenta que HttpModules puede tener acceso a los eventos del ciclo de vida de una solicitud y, por lo tanto, también se pueden usar para modificar la respuesta. Los HttpModules se usan generalmente para conectar las preocupaciones transversales como la seguridad, el registro, etc. en el proceso de procesamiento de solicitudes y también se pueden usar para reescribir URL e incluso para crear encabezados personalizados en la respuesta.

Como dice la documentación de Microsoft, “Un módulo HTTP es un ensamblado al que se llama en cada solicitud que se realiza a su aplicación. Los módulos HTTP se llaman como parte de la canalización de solicitudes ASP.NET y tienen acceso a los eventos del ciclo de vida a lo largo de la solicitud. Los módulos HTTP le permiten examinar las solicitudes entrantes y salientes y tomar medidas en función de la solicitud ".

Para crear un HttpModule personalizado, debe crear una clase que implemente la interfaz System.Web.IHttpModule. Para crear un HttpModule, siga estos pasos:

  1. Abra el IDE de Visual Studio
  2. Haga clic en Archivo-> Nuevo proyecto
  3. Crear un proyecto de biblioteca de clases
  4. Agregar referencia al ensamblado System.Web a este proyecto
  5. A continuación, cree una clase dentro de este proyecto que implemente la interfaz IHttpModule
  6. Escriba un controlador para el método Init para inicializar su módulo y suscribirse a uno o más eventos
  7. Opcionalmente, implemente un método Dispose en su módulo personalizado

A primera vista, nuestro HttpModule personalizado se ve así:

clase pública CustomHttpModule: IHttpModule

   {

       public void Dispose ()

       {

           lanzar nueva NotImplementedException ();

       }

       public void Init (contexto de HttpApplication)

       {

           lanzar nueva NotImplementedException ();

       }

   }

El siguiente fragmento de código muestra cómo puede suscribirse a eventos en su módulo HTTP personalizado.

public void Init (contexto de HttpApplication)

       {

           context.BeginRequest + = nuevo EventHandler (OnBeginRequest);

           context.EndRequest + = nuevo EventHandler (OnEndRequest);            

           context.LogRequest + = nuevo EventHandler (OnLogRequest);

       }

Escribamos ahora el código para el método OnLogRequest. Este método está destinado a registrar la ruta o cada solicitud a un archivo de texto. Así es como debería verse el método OnLogRequest:

public void OnLogRequest (remitente de objeto, EventArgs e)

       {

           HttpContext context = ((HttpApplication) remitente) .Context;

           string filePath = @ "D: \ Log.txt";

           usando (StreamWriter streamWriter = new StreamWriter (filePath))

           {

               streamWriter.WriteLine (context.Request.Path);

           }

       }

La siguiente lista de códigos ilustra el módulo HTTP personalizado completo.

CustomModule de clase pública: IHttpModule

   {

       public void Init (contexto de HttpApplication)

       {

           context.BeginRequest + = nuevo EventHandler (OnBeginRequest);

           context.EndRequest + = nuevo EventHandler (OnEndRequest);          

           context.LogRequest + = nuevo EventHandler (OnLogRequest);

       }

       public void OnLogRequest (remitente de objeto, EventArgs e)

       {

           HttpContext context = ((HttpApplication) remitente) .Context;

           string filePath = @ "D: \ Log.txt";

           usando (StreamWriter streamWriter = new StreamWriter (filePath))

           {

               streamWriter.WriteLine (context.Request.Path);

           }

       }

       public void OnBeginRequest (remitente de objeto, EventArgs e)

       {

           // Escribe tu código personalizado aquí

       }

       public void OnEndRequest (remitente de objeto, EventArgs e)

       {

           // Escribe tu código personalizado aquí

       }

       public void Dispose ()

       {

           // Escriba su código personalizado aquí para deshacerse de cualquier objeto si es necesario

       }

   }

El siguiente paso es utilizar el módulo HTTP personalizado. Para hacer esto, cree otro proyecto (esta vez, un proyecto de aplicación ASP.NET). Primero, cree la solución y agregue una referencia al módulo HTTP personalizado que acabamos de crear.

A continuación, deberá registrar el módulo HTTP personalizado en el archivo web.config. El siguiente fragmento de código ilustra cómo se puede registrar el módulo HTTP personalizado.

Y eso es todo lo que necesita hacer para usar su módulo HTTP personalizado.

Cuando se usa un módulo HTTP síncrono, el hilo no se liberará hasta que se complete el procesamiento de la solicitud. Esto puede convertirse en un cuello de botella de rendimiento importante cuando su módulo HTTP personalizado necesita realizar operaciones vinculadas de E / S de ejecución prolongada. Para resolver esto, puede aprovechar la programación asincrónica para implementar también un módulo HTTP asincrónico. Esto garantizaría que el rendimiento de su aplicación no se degrade cuando su módulo HTTP necesite realizar mucho procesamiento. La programación asincrónica ayuda a utilizar mejor los recursos disponibles.

Para implementar la asincronía en su módulo HTTP personalizado, querrá aprovechar la clase EventHandlerTaskAsyncHelper disponible como parte de .NET Framework 4.5. El siguiente fragmento de código ilustra cómo puede aprovechar esta clase para suscribirse a eventos en el método Init de su módulo HTTP personalizado. Tenga en cuenta que el método LogRequest debería devolver una instancia de tipo Task.

public void Init (contexto de HttpApplication)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = new EventHandlerTaskAsyncHelper (LogRequest);

           context.AddOnPostAuthorizeRequestAsync (asyncHelperObject.BeginEventHandler, asyncHelperObject.EndEventHandler);

       }

Aquí está la lista completa de códigos de la versión asincrónica de nuestro módulo HTTP personalizado.

CustomModule de clase pública: IHttpModule

   {

       public void Init (contexto de HttpApplication)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = new EventHandlerTaskAsyncHelper (LogRequest);

      context.AddOnPostAuthorizeRequestAsync (asyncHelperObject.BeginEventHandler, asyncHelperObject.EndEventHandler);

       }

       Private Async Task LogRequest (remitente de objeto, EventArgs e)

       {

           HttpContext context = ((HttpApplication) remitente) .Context;

           string filePath = @ "D: \ Log.txt";

            usando (StreamWriter streamWriter = new StreamWriter (filePath, true))

           {

               aguardar streamWriter.WriteLineAsync (context.Request.Path);

           }

       }

   }

Cómo hacer más en ASP.NET y ASP.NET Core:

  • Cómo usar el almacenamiento en caché en memoria en ASP.NET Core
  • Cómo manejar errores en ASP.NET Web API
  • Cómo pasar varios parámetros a los métodos del controlador de API web
  • Cómo registrar metadatos de solicitud y respuesta en ASP.NET Web API
  • Cómo trabajar con HttpModules en ASP.NET
  • Control de versiones avanzado en ASP.NET Core Web API
  • Cómo usar la inyección de dependencia en ASP.NET Core
  • Cómo trabajar con sesiones en ASP.NET
  • Cómo trabajar con HTTPHandlers en ASP.NET
  • Cómo usar IHostedService en ASP.NET Core
  • Cómo consumir un servicio WCF SOAP en ASP.NET Core
  • Cómo mejorar el rendimiento de las aplicaciones ASP.NET Core
  • Cómo consumir una API web ASP.NET Core con RestSharp
  • Cómo trabajar con el registro en ASP.NET Core
  • Cómo usar MediatR en ASP.NET Core
  • Cómo trabajar con el estado de la sesión en ASP.NET Core
  • Cómo usar Nancy en ASP.NET Core
  • Comprender el enlace de parámetros en ASP.NET Web API
  • Cómo cargar archivos en ASP.NET Core MVC
  • Cómo implementar el manejo de excepciones globales en ASP.NET Core Web API
  • Cómo implementar comprobaciones de estado en ASP.NET Core
  • Mejores prácticas de almacenamiento en caché en ASP.NET
  • Cómo utilizar la mensajería de Apache Kafka en .NET
  • Cómo habilitar CORS en su API web
  • Cuándo usar WebClient frente a HttpClient frente a HttpWebRequest
  • Cómo trabajar con Redis Cache en .NET
  • Cuándo usar Task.WaitAll frente a Task.WhenAll en .NET