Einführung in HTTP-Handler
Ein ASP.NET-HTTP-Handler ist der Prozess (oder "Endpunkt"), der als Antwort auf eine Anforderung an eine ASP.NET-Webanwendung ausgeführt wird. Der gebräuchlichste Handler ist ein ASP.NET-Seitenhandler, der AXPX-Dateien verarbeitet. Wenn Benutzer eine ASPX-Datei anfordern, wird die Anforderung von der Seite mithilfe des Seitenhandlers verarbeitet.
Der ASP.NET-Seitenhandler ist nur einer von vielen Handlertypen. ASP.NET bietet eine Reihe weiterer integrierter Handler, z. B. den Webdiensthandler für ASMX-Dateien.
Für eine besondere Behandlung können Sie benutzerdefinierte HTTP-Handler erstellen, die Sie anhand von Dateinamenerweiterungen in der Anwendung identifizieren können. In folgenden Szenarien könnten benutzerdefinierte HTTP-Handler beispielsweise sinnvoll eingesetzt werden:
-
RSS-Newsfeeds: Um einen RSS-Newsfeed für eine Site zu erstellen, können Sie einen Handler erstellen, der RSS-formatiertes XML ausgibt. Sie können dann in der Anwendung z. B. die .rss-Erweiterung an den benutzerdefinierten Handler binden. Wenn ein Benutzer eine Anforderung an die Site sendet, die mit .rss endet, wird zum Verarbeiten der Anforderung der Handler aufgerufen.
-
Bildserver: Für eine Webanwendung zur Bereitstellung von Bildern in verschiedenen Größen können Sie einen benutzerdefinierten Handler schreiben, der die Größe der Bilder anpasst und diese dann als Antwort des Handlers zurück an den Benutzer sendet.
HTTP-Handler haben Zugriff auf den Anwendungskontext einschließlich der Benutzeridentität (falls bekannt), des Anwendungszustands und der Sitzungsinformationen. Beim Anfordern eines HTTP-Handlers wird die ProcessRequest-Methode des entsprechenden Handlers aufgerufen. Die ProcessRequest-Methode des Handlers erstellt eine Antwort, die an den anfordernden Browser zurückgesendet wird. Wie bei jeder Seitenanforderung durchläuft die Antwort alle HTTP-Module, die Ereignisse abonniert haben, die nach Ausführung des Handlers auftreten. Weitere Informationen über die Verarbeitung von Webserveranforderungen finden Sie unter Übersicht über den Lebenszyklus von ASP.NET-Anwendungen.
HTTP-Handler können entweder synchron oder asynchron sein. Ein synchroner Handler wird erst dann beendet, wenn die Verarbeitung der HTTP-Anforderung, für die er aufgerufen wurde, abgeschlossen ist. Bei einem asynchronen Handler werden der Prozess und das Senden einer Antwort an den Benutzer unabhängig voneinander ausgeführt. Asynchrone Handler sind nützlich für länger andauernde Anwendungsprozesse, damit der Benutzer nicht auf das Ende des Prozesses warten muss, bevor er eine Antwort vom Server erhält.
Integrierte HTTP-Handler in ASP.NET
In ASP.NET werden HTTP-Anforderungen und HTTP-Handler anhand von Dateinamenerweiterungen einander zugeordnet. Jeder HTTP-Handler ermöglicht die Verarbeitung einzelner HTTP-URLs oder von Gruppen von URL-Erweiterungen innerhalb einer Anwendung. ASP.NET bietet mehrere integrierte HTTP-Handler, wie in der folgenden Tabelle aufgeführt.
| Handler | Beschreibung |
|---|---|
| ASP.NET-Seitenhandler (*.aspx) | Der standardmäßige HTTP-Handler für alle ASP.NET-Seiten. |
| Webdiensthandler (*.asmx) | Der Standard-HTTP-Handler für mit ASP.NET erstellte Webdienstseiten. |
| ASP.NET-Benutzersteuerelementhandler (*.ascx) | Der Standard-HTTP-Handler für alle ASP.NET-Benutzersteuerelementseiten. |
| Ablaufverfolgungshandler (trace.axd) | Ein Handler, der Ablaufverfolgungsinformationen der aktuellen Seite anzeigt. Ausführliche Informationen finden Sie unter Gewusst wie: Anzeigen von ASP.NET-Ablaufverfolgungsinformationen mit dem Ablaufverfolgungs-Viewer. |
Erstellen eines benutzerdefinierten HTTP-Handlers
Für einen synchronen benutzerdefinierten HTTP-Handler müssen Sie eine Klasse erstellen, die die IHttpHandler-Schnittstelle implementiert, für einen asynchronen benutzerdefinierten Handler hingegen eine Klasse, die die IHttpAsyncHandler-Schnittstelle implementiert. Für beide Handlerschnittstellen müssen Sie die IsReusable-Eigenschaft und die ProcessRequest-Methode implementieren. Die IsReusable-Eigenschaft gibt an, ob das IHttpHandlerFactory-Objekt (das Objekt, das den entsprechenden Handler aufruft) die Handler in einem Pool ablegen kann, um damit die Leistung zu steigern, oder ob jedes Mal, wenn der Handler benötigt wird, neue Instanzen erstellt werden müssen. Die ProcessRequest-Methode ist dafür verantwortlich, die einzelnen HTTP-Anforderungen zu verarbeiten.
Erstellen einer Dateinamenerweiterung
Wenn Sie eine Klassendatei als HTTP-Handler erstellen, können Sie den Handler so konfigurieren, dass er auf alle Dateinamenerweiterungen antwortet, die in IIS und ASP.NET noch nicht zugeordnet sind. Wenn Sie z. B. einen HTTP-Handler zum Generieren eines RSS-Newsfeeds erstellen, können Sie den Handler der Erweiterung .rss zuordnen. Damit ASP.NET für die benutzerdefinierte Dateinamenerweiterung den richtigen Handler verwendet, muss die Erweiterung der Handlerklassendatei in IIS der ASP.NET-Umgebung und in der Anwendung dem benutzerdefinierten Handler zugeordnet werden.
Standardmäßig wird benutzerdefinierten HTTP-Handlern die Dateinamenerweiterung .ashx zugeordnet – so wie dem ASP.NET-Seitenhandler die Erweiterung .aspx zugeordnet wird. Dementsprechend wird, wenn Sie eine HTTP-Handlerklasse mit der Dateinamenerweiterung .ashx erstellen, der Handler automatisch bei IIS und ASP.NET registriert.
Wenn Sie eine benutzerdefinierte Dateinamenerweiterung für den Handler erstellen möchten, müssen Sie die Erweiterung explizit bei IIS und ASP.NET registrieren. Wenn Sie nicht die Dateinamenerweiterung .ashx verwenden, haben Sie den Vorteil, dass Sie den Handler dann für andere Erweiterungszuordnungen wiederverwenden können. So kann in der einen Anwendung der benutzerdefinierte Handler auf Anforderungen mit der Erweiterung .rss antworten, in einer anderen Anwendung auf Anforderungen mit der Endung .feed. Des Weiteren kann der Handler in der gleichen Anwendung beiden Dateinamenerweiterungen zugeordnet werden und je nach Erweiterung unterschiedliche Antworten generieren.
Asynchrone HTTP-Handler
Mit asynchronen HTTP-Handlern können Sie einen externen Prozess starten, z. B. einen Methodenaufruf an einen Remoteserver, und dann mit der Verarbeitung des Handlers fortfahren, ohne auf das Beenden des externen Prozesses warten zu müssen. Während der Verarbeitung eines asynchronen HTTP-Handlers platziert ASP.NET den Thread, der gewöhnlich für den externen Prozess verwendet würde, wieder im Threadpool, bis der Handler vom externen Prozess einen Rückruf erhält. Dadurch wird ein Blockieren von Threads verhindert und die Leistung erheblich verbessert, da nur eine begrenzte Anzahl von Threads gleichzeitig ausgeführt werden kann. Wenn mehrere Benutzer synchrone, von externen Prozessen abhängige HTTP-Handler anfordern, kann es schnell passieren, dass das Betriebssystem über keine weiteren Threads mehr verfügt, da viele Threads blockiert sind und auf externe Prozesse warten.
Wenn Sie einen asynchronen Handler erstellen, müssen Sie nicht nur die IHttpAsyncHandler-Schnittstelle implementieren, sondern auch BeginProcessRequest, um einen asynchronen Aufruf zum Verarbeiten einzelner HTTP-Anforderungen zu initiieren. Sie müssen außerdem die EndProcessRequest-Methode implementieren, um bei Beendigung des Prozesses Bereinigungscode auszuführen.
Benutzerdefinierte IHttpHandlerFactory-Klassen
Die IHttpHandlerFactory-Klasse empfängt Anforderungen und ist für die Weiterleitung der Anforderungen an den entsprechenden HTTP-Handler verantwortlich. Sie können eine benutzerdefinierte HTTP-Handlerfactory erstellen, indem Sie eine Klasse erstellen, die die IHttpHandlerFactory-Schnittstelle implementiert. Durch das Erstellen einer benutzerdefinierten Handlerfactory können Sie die Verarbeitung von HTTP-Anforderungen genauer steuern, indem Sie verschiedene Handler erstellen, die auf Laufzeitbedingungen basieren. Mit einer benutzerdefinierten HTTP-Handlerfactory können Sie z. B. für eine Dateiart jeweils unterschiedliche HTTP-Handler für die HTTP-Anforderungsmethoden PUT und GET instanziieren.