Comment travailler avec HttpModules dans ASP.NET

Il existe deux manières d'injecter la logique dans le pipeline de requêtes d'une application ASP.NET: HttpHandlers et HttpModules. Un HttpModule est un composant qui fait partie du pipeline de traitement des demandes ASP.NET et est appelé à chaque demande adressée à votre application.

Notez que HttpModules peut avoir accès aux événements du cycle de vie d'une requête et qu'ils peuvent donc également être utilisés pour modifier la réponse. Les HttpModules sont généralement utilisés pour brancher les problèmes transversaux tels que la sécurité, la journalisation, etc. dans le pipeline de traitement des demandes et peuvent également être utilisés pour la réécriture d'URL et même pour créer des en-têtes personnalisés dans la réponse.

Comme l'indique la documentation de Microsoft, «Un module HTTP est un assemblage qui est appelé à chaque requête adressée à votre application. Les modules HTTP sont appelés dans le cadre du pipeline de requêtes ASP.NET et ont accès aux événements du cycle de vie tout au long de la requête. Les modules HTTP vous permettent d'examiner les demandes entrantes et sortantes et de prendre des mesures en fonction de la demande. »

Pour créer un HttpModule personnalisé, vous devez créer une classe qui implémente l'interface System.Web.IHttpModule. Pour créer un HttpModule, procédez comme suit:

  1. Ouvrez l'IDE de Visual Studio
  2. Cliquez sur Fichier-> Nouveau projet
  3. Créer un projet de bibliothèque de classes
  4. Ajouter une référence à l'assembly System.Web à ce projet
  5. Ensuite, créez une classe dans ce projet qui implémente l'interface IHttpModule
  6. Ecrivez un gestionnaire pour la méthode Init pour initialiser votre module et vous abonner à un ou plusieurs événements
  7. Si vous le souhaitez, implémentez une méthode Dispose dans votre module personnalisé

À première vue, notre HttpModule personnalisé ressemble à ceci:

classe publique CustomHttpModule: IHttpModule

   {

       public void Dispose ()

       {

           throw new NotImplementedException ();

       }

       public void Init (contexte HttpApplication)

       {

           throw new NotImplementedException ();

       }

   }

L'extrait de code suivant montre comment vous pouvez vous abonner à des événements dans votre module HTTP personnalisé.

public void Init (contexte HttpApplication)

       {

           context.BeginRequest + = new EventHandler (OnBeginRequest);

           context.EndRequest + = new EventHandler (OnEndRequest);            

           context.LogRequest + = new EventHandler (OnLogRequest);

       }

Écrivons maintenant le code de la méthode OnLogRequest. Cette méthode est destinée à enregistrer le chemin ou chaque requête dans un fichier texte. Voici à quoi devrait ressembler la méthode OnLogRequest:

public void OnLogRequest (expéditeur d'objet, EventArgs e)

       {

           Contexte HttpContext = ((HttpApplication) expéditeur) .Context;

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

           en utilisant (StreamWriter streamWriter = new StreamWriter (filePath))

           {

               streamWriter.WriteLine (context.Request.Path);

           }

       }

La liste de codes suivante illustre le module HTTP personnalisé complet.

classe publique CustomModule: IHttpModule

   {

       public void Init (contexte HttpApplication)

       {

           context.BeginRequest + = new EventHandler (OnBeginRequest);

           context.EndRequest + = new EventHandler (OnEndRequest);          

           context.LogRequest + = new EventHandler (OnLogRequest);

       }

       public void OnLogRequest (expéditeur d'objet, EventArgs e)

       {

           Contexte HttpContext = ((HttpApplication) expéditeur) .Context;

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

           en utilisant (StreamWriter streamWriter = new StreamWriter (filePath))

           {

               streamWriter.WriteLine (context.Request.Path);

           }

       }

       public void OnBeginRequest (expéditeur d'objet, EventArgs e)

       {

           // Écrivez votre code personnalisé ici

       }

       public void OnEndRequest (expéditeur d'objet, EventArgs e)

       {

           // Écrivez votre code personnalisé ici

       }

       public void Dispose ()

       {

           // Écrivez votre code personnalisé ici pour supprimer les objets si nécessaire

       }

   }

L'étape suivante consiste à utiliser le module HTTP personnalisé. Pour ce faire, créez un autre projet (cette fois, un projet d'application ASP.NET). Tout d'abord, créez la solution et ajoutez une référence au module HTTP personnalisé que nous venons de créer.

Ensuite, vous devrez enregistrer le module HTTP personnalisé dans le fichier web.config. L'extrait de code suivant illustre comment le module HTTP personnalisé peut être inscrit.

Et c'est tout ce que vous devez faire pour utiliser votre module HTTP personnalisé.

Lors de l'utilisation d'un module HTTP synchrone, le thread ne serait pas libéré avant la fin du traitement de la demande. Cela peut devenir un goulot d'étranglement majeur des performances lorsque votre module HTTP personnalisé doit effectuer des opérations liées aux E / S de longue durée. Pour résoudre ce problème, vous pouvez également profiter de la programmation asynchrone pour implémenter un module HTTP asynchrone. Cela garantirait que les performances de votre application ne se dégradent pas lorsque votre module HTTP a besoin de beaucoup de traitement. La programmation asynchrone permet une meilleure utilisation des ressources disponibles.

Pour implémenter l'asynchronie dans votre module HTTP personnalisé, vous souhaiterez tirer parti de la classe EventHandlerTaskAsyncHelper disponible dans le cadre de .NET Framework 4.5. L'extrait de code suivant illustre comment vous pouvez tirer parti de cette classe pour vous abonner à des événements dans la méthode Init de votre module HTTP personnalisé. Notez que la méthode LogRequest doit renvoyer une instance de type Task.

public void Init (contexte HttpApplication)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = new EventHandlerTaskAsyncHelper (LogRequest);

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

       }

Voici la liste complète des codes de la version asynchrone de notre module HTTP personnalisé.

classe publique CustomModule: IHttpModule

   {

       public void Init (contexte HttpApplication)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = new EventHandlerTaskAsyncHelper (LogRequest);

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

       }

       Demande de journal de tâches asynchrone privée (expéditeur d'objet, EventArgs e)

       {

           Contexte HttpContext = ((HttpApplication) expéditeur) .Context;

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

            en utilisant (StreamWriter streamWriter = new StreamWriter (filePath, true))

           {

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

           }

       }

   }

Comment faire plus dans ASP.NET et ASP.NET Core:

  • Comment utiliser la mise en cache en mémoire dans ASP.NET Core
  • Comment gérer les erreurs dans l'API Web ASP.NET
  • Comment passer plusieurs paramètres aux méthodes du contrôleur API Web
  • Comment consigner les métadonnées de demande et de réponse dans l'API Web ASP.NET
  • Comment travailler avec HttpModules dans ASP.NET
  • Contrôle de version avancé dans l'API Web ASP.NET Core
  • Comment utiliser l'injection de dépendances dans ASP.NET Core
  • Comment travailler avec des sessions dans ASP.NET
  • Comment travailler avec HTTPHandlers dans ASP.NET
  • Comment utiliser IHostedService dans ASP.NET Core
  • Comment consommer un service SOAP WCF dans ASP.NET Core
  • Comment améliorer les performances des applications ASP.NET Core
  • Comment consommer une API Web ASP.NET Core à l'aide de RestSharp
  • Comment travailler avec la journalisation dans ASP.NET Core
  • Comment utiliser MediatR dans ASP.NET Core
  • Comment travailler avec l'état de session dans ASP.NET Core
  • Comment utiliser Nancy dans ASP.NET Core
  • Comprendre la liaison de paramètres dans l'API Web ASP.NET
  • Comment télécharger des fichiers dans ASP.NET Core MVC
  • Comment implémenter la gestion globale des exceptions dans l'API Web ASP.NET Core
  • Comment implémenter les vérifications de l'état dans ASP.NET Core
  • Meilleures pratiques de mise en cache dans ASP.NET
  • Comment utiliser la messagerie Apache Kafka dans .NET
  • Comment activer CORS sur votre API Web
  • Quand utiliser WebClient vs HttpClient vs HttpWebRequest
  • Comment travailler avec Redis Cache dans .NET
  • Quand utiliser Task.WaitAll par rapport à Task.WhenAll dans .NET