Come lavorare con HttpModules in ASP.NET

Esistono due modi in cui è possibile inserire la logica nella pipeline di richieste di un'applicazione ASP.NET: HttpHandlers e HttpModules. Un HttpModule è un componente che fa parte della pipeline di elaborazione delle richieste ASP.NET e viene chiamato a ogni richiesta effettuata all'applicazione.

Si noti che HttpModules può avere accesso agli eventi del ciclo di vita di una richiesta e quindi possono essere utilizzati anche per modificare la risposta. Gli HttpModules vengono generalmente utilizzati per collegare problemi trasversali come sicurezza, registrazione, ecc. Nella pipeline di elaborazione delle richieste e possono essere utilizzati anche per la riscrittura degli URL e anche per la creazione di intestazioni personalizzate nella risposta.

Come afferma la documentazione di Microsoft, "Un modulo HTTP è un assembly che viene chiamato a ogni richiesta effettuata all'applicazione. I moduli HTTP vengono chiamati come parte della pipeline di richieste ASP.NET e hanno accesso agli eventi del ciclo di vita durante la richiesta. I moduli HTTP consentono di esaminare le richieste in entrata e in uscita e di agire in base alla richiesta. "

Per creare un HttpModule personalizzato, è necessario creare una classe che implementa l'interfaccia System.Web.IHttpModule. Per creare un HttpModule, segui questi passaggi:

  1. Apri l'IDE di Visual Studio
  2. Fare clic su File-> Nuovo progetto
  3. Crea un progetto di libreria di classi
  4. Aggiungere il riferimento all'assembly System.Web a questo progetto
  5. Successivamente, crea una classe all'interno di questo progetto che implementa l'interfaccia IHttpModule
  6. Scrivi un gestore per il metodo Init per inizializzare il tuo modulo e iscriverti a uno o più eventi
  7. Facoltativamente, implementare un metodo Dispose nel modulo personalizzato

A prima vista, il nostro HttpModule personalizzato si presenta così:

classe pubblica CustomHttpModule: IHttpModule

   {

       public void Dispose ()

       {

           lancia una nuova NotImplementedException ();

       }

       public void Init (contesto HttpApplication)

       {

           lancia una nuova NotImplementedException ();

       }

   }

Il frammento di codice seguente mostra come iscriversi agli eventi nel modulo HTTP personalizzato.

public void Init (contesto HttpApplication)

       {

           context.BeginRequest + = new EventHandler (OnBeginRequest);

           context.EndRequest + = new EventHandler (OnEndRequest);            

           context.LogRequest + = new EventHandler (OnLogRequest);

       }

Scriviamo ora il codice per il metodo OnLogRequest. Questo metodo ha lo scopo di registrare il percorso o ogni richiesta in un file di testo. Ecco come dovrebbe apparire il metodo OnLogRequest:

public void OnLogRequest (oggetto mittente, EventArgs e)

       {

           Contesto HttpContext = ((HttpApplication) mittente) .Context;

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

           using (StreamWriter streamWriter = new StreamWriter (filePath))

           {

               streamWriter.WriteLine (context.Request.Path);

           }

       }

Il seguente listato di codice illustra il modulo HTTP personalizzato completo.

classe pubblica CustomModule: IHttpModule

   {

       public void Init (contesto HttpApplication)

       {

           context.BeginRequest + = new EventHandler (OnBeginRequest);

           context.EndRequest + = new EventHandler (OnEndRequest);          

           context.LogRequest + = new EventHandler (OnLogRequest);

       }

       public void OnLogRequest (oggetto mittente, EventArgs e)

       {

           Contesto HttpContext = ((HttpApplication) mittente) .Context;

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

           using (StreamWriter streamWriter = new StreamWriter (filePath))

           {

               streamWriter.WriteLine (context.Request.Path);

           }

       }

       public void OnBeginRequest (oggetto mittente, EventArgs e)

       {

           // Scrivi qui il tuo codice personalizzato

       }

       public void OnEndRequest (oggetto mittente, EventArgs e)

       {

           // Scrivi qui il tuo codice personalizzato

       }

       public void Dispose ()

       {

           // Scrivi qui il tuo codice personalizzato per eliminare eventuali oggetti, se necessario

       }

   }

Il passaggio successivo consiste nell'utilizzare il modulo HTTP personalizzato. Per fare ciò, crea un altro progetto (questa volta, un progetto di applicazione ASP.NET). Innanzitutto, crea la soluzione e aggiungi il riferimento al modulo HTTP personalizzato che abbiamo appena creato.

Successivamente, sarà necessario registrare il modulo HTTP personalizzato nel file web.config. Il frammento di codice seguente illustra come registrare il modulo HTTP personalizzato.

E questo è tutto ciò che devi fare per utilizzare il tuo modulo HTTP personalizzato.

Quando si utilizza un modulo HTTP sincrono, il thread non verrà rilasciato fino al completamento dell'elaborazione della richiesta. Questo può diventare un importante collo di bottiglia delle prestazioni quando il modulo HTTP personalizzato deve eseguire operazioni di I / O a esecuzione prolungata. Per risolvere questo problema, puoi sfruttare la programmazione asincrona per implementare anche un modulo HTTP asincrono. Ciò garantirebbe che le prestazioni della tua applicazione non peggiorino quando il tuo modulo HTTP deve eseguire molte elaborazioni. La programmazione asincrona aiuta a un migliore utilizzo delle risorse disponibili.

Per implementare l'asincronia nel modulo HTTP personalizzato, ti consigliamo di sfruttare la classe EventHandlerTaskAsyncHelper disponibile come parte di .NET Framework 4.5. Il frammento di codice seguente illustra come sfruttare questa classe per iscriversi agli eventi nel metodo Init del modulo HTTP personalizzato. Notare che il metodo LogRequest dovrebbe restituire un'istanza di tipo Task.

public void Init (contesto HttpApplication)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = nuovo EventHandlerTaskAsyncHelper (LogRequest);

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

       }

Ecco l'elenco completo del codice della versione asincrona del nostro modulo HTTP personalizzato.

classe pubblica CustomModule: IHttpModule

   {

       public void Init (contesto HttpApplication)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = nuovo EventHandlerTaskAsyncHelper (LogRequest);

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

       }

       Task LogRequest asincrono privato (mittente oggetto, EventArgs e)

       {

           Contesto HttpContext = ((HttpApplication) mittente) .Context;

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

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

           {

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

           }

       }

   }

Come fare di più in ASP.NET e ASP.NET Core:

  • Come usare la memorizzazione nella cache in memoria in ASP.NET Core
  • Come gestire gli errori nell'API Web ASP.NET
  • Come passare più parametri ai metodi del controller dell'API Web
  • Come registrare i metadati di richieste e risposte nell'API Web ASP.NET
  • Come lavorare con HttpModules in ASP.NET
  • Controllo delle versioni avanzato nell'API Web ASP.NET Core
  • Come usare l'inserimento delle dipendenze in ASP.NET Core
  • Come lavorare con le sessioni in ASP.NET
  • Come lavorare con HTTPHandlers in ASP.NET
  • Come utilizzare IHostedService in ASP.NET Core
  • Come utilizzare un servizio SOAP WCF in ASP.NET Core
  • Come migliorare le prestazioni delle applicazioni ASP.NET Core
  • Come utilizzare un'API Web ASP.NET Core usando RestSharp
  • Come lavorare con la registrazione in ASP.NET Core
  • Come usare MediatR in ASP.NET Core
  • Come lavorare con lo stato della sessione in ASP.NET Core
  • Come utilizzare Nancy in ASP.NET Core
  • Comprendere l'associazione di parametri nell'API Web ASP.NET
  • Come caricare file in ASP.NET Core MVC
  • Come implementare la gestione delle eccezioni globale nell'API Web ASP.NET Core
  • Come implementare i controlli di integrità in ASP.NET Core
  • Procedure consigliate per la memorizzazione nella cache in ASP.NET
  • Come utilizzare la messaggistica Apache Kafka in .NET
  • Come abilitare CORS sulla tua API Web
  • Quando utilizzare WebClient vs. HttpClient vs. HttpWebRequest
  • Come lavorare con Redis Cache in .NET
  • Quando utilizzare Task.WaitAll rispetto a Task.WhenAll in .NET