Asp.Net IHttpHandler vorgestellt ASP.NET zwei häufig verwendeten Verarbeitungsschnittstellen beim Beantworten von HTTP-Anfragen sind IHttpHandler und IHttpModule.
Im Allgemeinen wird IHttpHandler verwendet, um eine bestimmte Art von Anfrage zu verarbeiten, wie zum Beispiel die separate Verarbeitung jeder *.asp, *.aspx Datei. IHttpModule wird üblicherweise verwendet, um Operationen zu bearbeiten, die häufig für die Anfrage erforderlich sind, wie etwa einige der gleichen Prüfungen auf der Anfrageseite.
Schauen wir uns die Verarbeitungsschritte des IIS-Servers beim Stellen der entsprechenden HTTP-Anfrage an. ASP.NET hat das Konzept der Pipeline, was bedeutet, dass jede ASP.NET Anfrage eine Reihe entsprechender Operationen in IIS hat, um eine zeilenähnliche Sequenz zu bilden.
ASP.NET Einführung in die Pipeline
Schauen wir uns das Verarbeitungszeitdiagramm der Pipeline an:
Wie aus der Abbildung zu sehen ist, wird nach Eintreffen der Anfrage die Implementierung von HttpModule verarbeitet und anschließend die ProcessRequest()-Methode von HttpHandler aufgerufen, um die spezifische Antwort zu geben. Daher ist es nicht schwer zu erkennen, warum die Behandlung klassenspezifischer Anfragen in der HttpHandler-Klasse liegt, während einige Prüfungen durchgeführt werden, die allen Anfragen im HttpModule gemeinsam sind.
Code-Praxis
IHttpHandler
Der Autor ist kürzlich auf die Nutzung von IHttpHandler zur Bearbeitung von Client-Schnittstellenaufrufen im Projekt gestoßen, daher wollen wir kurz das einfache Interface-Design auf Basis von IHttpHandler besprechen.
Die IHttpHandler-Schnittstelle besteht nur aus zwei Mitgliedern:
Das IsReusable-Attribut identifiziert, ob das HttpHandler-Objekt von anderen Instanzen verwendet werden kann, und wir setzen es in der Regel auf True. Die ProcessRequest()-Methode ist eine spezifische Antwort auf die Anfrage, und wir müssen nur die spezifische Geschäftslogik-Operation hier einfügen.
Zuerst erstelle ein neues Webprojekt und füge eine Handler-Klasse hinzu:
Die RayHandler-Klasse implementiert die ProcessRequest()-Funktion der IHttpHandler-Schnittstelle, die lediglich eine direkte Ausgabe eines Textes ist.
Dann müssen wir folgende Konfiguration in der Web.config-Datei hinzufügen:
path zeigt URL-Matching an, wie zum Beispiel *.ray, was bedeutet, dass der Handler auf URL-Anfragen mit ".ray" antwortet, das Verb die Anfragemethode wie Get/Post angibt und * bedeutet, dass es alle übereinstimmt. type gibt den Typ der Handler-Klasse an, WebApplication2.RayHandler ist der Klassenname, WebApplication2 bezieht sich auf den Namen der Assembly im Bin-Verzeichnis, zum Beispiel ist der Assemblyname im Beispiel WebApplication2.dll, und es ist nicht nötig, hier einen Suffixnamen zu definieren.
Starten Sie die Seite, geben Sie die URL ein, die auf ".ray" endet, und Sie sehen folgendes Ergebnis:
Überblick über die IHttpHandlerFactory
Manchmal müssen wir mit mehreren verschiedenen Suffixen zu tun haben, ein Suffix entspricht einer Handler-Klasse, und so sieht unsere Web.config-Datei aus:
Wenn wir viele HttpHandler-Implementierungsklassen haben, wird unsere Web.config-Dateikonfiguration zwangsläufig ausführlich aussehen. Oder in manchen Fällen, wenn wir nur bestimmen können, welcher Handler reagiert, wenn das Programm läuft, müssen wir IHttpHandlerFactory verwenden.
IHttpHandlerFactory ist wie folgt definiert:
Unter ihnen:
GetHandler(): Gibt eine Instanz zurück, die die IHttpHandler-Schnittstelle implementiert; ReleaseHandler(): Ermöglicht es Factory, eine bestehende Handler-Instanz wiederzuverwenden. Nehmen wir die oben genannten Ray- und RSS-Anfragen als Beispiel: Implementiere die Factory-Klasse:
In diesem Fall ist die Konfiguration in Web.config wie folgt:
Zu diesem Zeitpunkt wird die Funktion implementiert, die Factory-Klasse für verschiedene spezifische Handler zu verwenden, was die Konfiguration vereinfacht.
Skalierbare IHttpHandlerFactory
In der obigen Implementierung muss das Programm, falls es in Zukunft eine neue Suffix-Behandlungsmethode hinzufügen muss, die Switch-Anweisung in GetHandler() ändern, was ebenfalls Fehler verursachen oder andere Sicherheitsrisiken mit sich bringen kann. Ist es also möglich, die HandlerFactory-Klasse für spätere Erweiterungen unverändert zu lassen?
Die Antwort lautet definitiv ja. Leser, die mit dem Designmuster vertraut sind, sollten verstehen, dass es sich um ein einfaches Fabrikmuster handelt und dass wir zur Erreichung der vorherigen Funktionen den Designmodus namens Advanced Points verwenden können.
Und hier können wir auch die Sprachfunktion der C#-Sprache verwenden – Reflection. Durch den Reflexionsmechanismus von C# spiegeln wir den entsprechenden Hanlder-Typ entsprechend dem Suffix der URL wider, solange wir uns auf die Entsprechung zwischen dem Suffixnamen der URL und dem Klassennamen des Handlers einig sind.
Zum Beispiel schreiben wir GetHandler() wie folgt um:
In diesem Fall müssen Sie die Handler-Klasse nur in die Methode unter denselben Namensraum wie die HandlerFactory-Klasse legen und sie korrekt in Web.config konfigurieren. Wenn es zum Beispiel eine RayHandler-Klasse gibt, sollte folgende Konfiguration hinzugefügt werden, um automatisch zu übereinstimmen:
Zusammenfassung Dieser Artikel führt kurz die Verwendung von IHttpHandler in ASP.NET ein, bietet die Implementierung von IHttpHandlerFactory bei der Verarbeitung mehrerer Handler-Anfragen und verbessert schließlich eine skalierbare Multi-Request-Handler-Implementierung mithilfe des Reflexionsmechanismus von C#.
|