So arbeiten Sie mit HttpModules in ASP.NET

Es gibt zwei Möglichkeiten, wie Sie Logik in die Anforderungspipeline einer ASP.NET-Anwendung einfügen können: HttpHandlers und HttpModules. Ein HttpModule ist eine Komponente, die Teil der ASP.NET-Anforderungsverarbeitungspipeline ist und bei jeder Anforderung an Ihre Anwendung aufgerufen wird.

Beachten Sie, dass HttpModules Zugriff auf die Lebenszyklusereignisse einer Anforderung haben und daher auch zum Ändern der Antwort verwendet werden können. HttpModules werden im Allgemeinen zum Einfügen von Querschnittsthemen wie Sicherheit, Protokollierung usw. in die Anforderungsverarbeitungspipeline verwendet und können auch zum erneuten Schreiben von URLs und sogar zum Erstellen benutzerdefinierter Header in der Antwort verwendet werden.

In der Microsoft-Dokumentation heißt es: „Ein HTTP-Modul ist eine Assembly, die bei jeder Anforderung an Ihre Anwendung aufgerufen wird. HTTP-Module werden als Teil der ASP.NET-Anforderungspipeline aufgerufen und haben während der gesamten Anforderung Zugriff auf Lebenszyklusereignisse. Mit HTTP-Modulen können Sie eingehende und ausgehende Anforderungen untersuchen und basierend auf der Anforderung Maßnahmen ergreifen. “

Um ein benutzerdefiniertes HttpModule zu erstellen, sollten Sie eine Klasse erstellen, die die System.Web.IHttpModule-Schnittstelle implementiert. Gehen Sie folgendermaßen vor, um ein HttpModule zu erstellen:

  1. Öffnen Sie die Visual Studio-IDE
  2. Klicken Sie auf Datei-> Neues Projekt
  3. Erstellen Sie ein Klassenbibliotheksprojekt
  4. Fügen Sie diesem Projekt einen Verweis auf die System.Web-Assembly hinzu
  5. Erstellen Sie als Nächstes in diesem Projekt eine Klasse, die die IHttpModule-Schnittstelle implementiert
  6. Schreiben Sie einen Handler für die Init-Methode, um Ihr Modul zu initialisieren und ein oder mehrere Ereignisse zu abonnieren
  7. Implementieren Sie optional eine Dispose-Methode in Ihrem benutzerdefinierten Modul

Auf den ersten Blick sieht unser benutzerdefiniertes HttpModule folgendermaßen aus:

öffentliche Klasse CustomHttpModule: IHttpModule

   {

       public void Dispose ()

       {

           neue NotImplementedException () auslösen;

       }}

       public void Init (HttpApplication-Kontext)

       {

           neue NotImplementedException () auslösen;

       }}

   }}

Das folgende Codefragment zeigt, wie Sie Ereignisse in Ihrem benutzerdefinierten HTTP-Modul abonnieren können.

public void Init (HttpApplication-Kontext)

       {

           context.BeginRequest + = neuer EventHandler (OnBeginRequest);

           context.EndRequest + = neuer EventHandler (OnEndRequest);            

           context.LogRequest + = neuer EventHandler (OnLogRequest);

       }}

Schreiben wir nun den Code für die OnLogRequest-Methode. Diese Methode soll den Pfad oder jede Anforderung in einer Textdatei protokollieren. So sollte die OnLogRequest-Methode aussehen:

public void OnLogRequest (Objektabsender, EventArgs e)

       {

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

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

           using (StreamWriter streamWriter = neuer StreamWriter (filePath))

           {

               streamWriter.WriteLine (context.Request.Path);

           }}

       }}

Die folgende Codeliste zeigt das vollständige benutzerdefinierte HTTP-Modul.

öffentliche Klasse CustomModule: IHttpModule

   {

       public void Init (HttpApplication-Kontext)

       {

           context.BeginRequest + = neuer EventHandler (OnBeginRequest);

           context.EndRequest + = neuer EventHandler (OnEndRequest);          

           context.LogRequest + = neuer EventHandler (OnLogRequest);

       }}

       public void OnLogRequest (Objektabsender, EventArgs e)

       {

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

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

           using (StreamWriter streamWriter = neuer StreamWriter (filePath))

           {

               streamWriter.WriteLine (context.Request.Path);

           }}

       }}

       public void OnBeginRequest (Objektabsender, EventArgs e)

       {

           // Schreiben Sie hier Ihren benutzerdefinierten Code

       }}

       public void OnEndRequest (Objektabsender, EventArgs e)

       {

           // Schreiben Sie hier Ihren benutzerdefinierten Code

       }}

       public void Dispose ()

       {

           // Schreiben Sie hier Ihren benutzerdefinierten Code, um bei Bedarf alle Objekte zu entsorgen

       }}

   }}

Der nächste Schritt ist die Verwendung des benutzerdefinierten HTTP-Moduls. Erstellen Sie dazu ein anderes Projekt (diesmal ein ASP.NET-Anwendungsprojekt). Erstellen Sie zunächst die Lösung und fügen Sie einen Verweis auf das gerade erstellte benutzerdefinierte HTTP-Modul hinzu.

Als Nächstes müssen Sie das benutzerdefinierte HTTP-Modul in der Datei web.config registrieren. Das folgende Codefragment zeigt, wie das benutzerdefinierte HTTP-Modul registriert werden kann.

Und das ist alles, was Sie tun müssen, um Ihr benutzerdefiniertes HTTP-Modul zu verwenden.

Bei Verwendung eines synchronen HTTP-Moduls wird der Thread erst freigegeben, wenn die Anforderungsverarbeitung abgeschlossen ist. Dies kann zu einem großen Leistungsengpass werden, wenn Ihr benutzerdefiniertes HTTP-Modul lang laufende E / A-gebundene Vorgänge ausführen muss. Um dies zu lösen, können Sie die asynchrone Programmierung nutzen, um auch ein asynchrones HTTP-Modul zu implementieren. Dies würde sicherstellen, dass die Leistung Ihrer Anwendung nicht beeinträchtigt wird, wenn Ihr HTTP-Modul viel Verarbeitung benötigt. Asynchrone Programmierung hilft bei der besseren Nutzung der verfügbaren Ressourcen.

Um die Asynchronität in Ihrem benutzerdefinierten HTTP-Modul zu implementieren, möchten Sie die EventHandlerTaskAsyncHelper-Klasse nutzen, die als Teil von .NET Framework 4.5 verfügbar ist. Das folgende Codeausschnitt zeigt, wie Sie diese Klasse nutzen können, um Ereignisse in der Init-Methode Ihres benutzerdefinierten HTTP-Moduls zu abonnieren. Beachten Sie, dass die LogRequest-Methode eine Instanz vom Typ Task zurückgeben sollte.

public void Init (HttpApplication-Kontext)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = new EventHandlerTaskAsyncHelper (LogRequest);

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

       }}

Hier finden Sie die vollständige Codeliste der asynchronen Version unseres benutzerdefinierten HTTP-Moduls.

öffentliche Klasse CustomModule: IHttpModule

   {

       public void Init (HttpApplication-Kontext)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = new EventHandlerTaskAsyncHelper (LogRequest);

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

       }}

       private asynchrone Aufgabe LogRequest (Objektabsender, EventArgs e)

       {

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

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

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

           {

               warte auf streamWriter.WriteLineAsync (context.Request.Path);

           }}

       }}

   }}

So machen Sie mehr in ASP.NET und ASP.NET Core:

  • Verwendung des In-Memory-Caching in ASP.NET Core
  • Behandlung von Fehlern in der ASP.NET-Web-API
  • Übergeben mehrerer Parameter an Web-API-Controller-Methoden
  • So protokollieren Sie Anforderungs- und Antwortmetadaten in der ASP.NET-Web-API
  • So arbeiten Sie mit HttpModules in ASP.NET
  • Erweiterte Versionierung in der ASP.NET Core-Web-API
  • Verwendung der Abhängigkeitsinjektion in ASP.NET Core
  • So arbeiten Sie mit Sitzungen in ASP.NET
  • So arbeiten Sie mit HTTPHandlern in ASP.NET
  • Verwendung von IHostedService in ASP.NET Core
  • So verwenden Sie einen WCF-SOAP-Dienst in ASP.NET Core
  • So verbessern Sie die Leistung von ASP.NET Core-Anwendungen
  • So verwenden Sie eine ASP.NET Core-Web-API mit RestSharp
  • So arbeiten Sie mit der Protokollierung in ASP.NET Core
  • Verwendung von MediatR in ASP.NET Core
  • So arbeiten Sie mit dem Sitzungsstatus in ASP.NET Core
  • Verwendung von Nancy in ASP.NET Core
  • Grundlegendes zur Parameterbindung in der ASP.NET-Web-API
  • So laden Sie Dateien in ASP.NET Core MVC hoch
  • Implementieren der globalen Ausnahmebehandlung in der ASP.NET Core-Web-API
  • Implementieren von Integritätsprüfungen in ASP.NET Core
  • Best Practices für das Caching in ASP.NET
  • Verwendung von Apache Kafka Messaging in .NET
  • So aktivieren Sie CORS in Ihrer Web-API
  • Wann wird WebClient vs. HttpClient vs. HttpWebRequest verwendet?
  • So arbeiten Sie mit Redis Cache in .NET
  • Verwendung von Task.WaitAll vs. Task.WhenAll in .NET