IHttpHandler vs IHttpModule

81

Meine Frage ist einfach (obwohl die Antwort höchstwahrscheinlich nicht lautet): Ich versuche zu entscheiden, wie ein serverseitiger Upload-Handler in C # / ASP.NET implementiert wird.

Ich habe sowohl HttpModules (IHttpModule-Schnittstelle) als auch HttpHandlers (IHttpHandler-Schnittstelle) verwendet, und mir fällt ein, dass ich dies mit beiden Mechanismen implementieren könnte. Mir fällt auch ein, dass ich die Unterschiede zwischen den beiden nicht verstehe.

Meine Frage lautet also: In welchen Fällen würde ich IHttpHandler anstelle von IHttpModule verwenden (und umgekehrt)?

Wird man in der Pipeline viel höher ausgeführt? Ist eine Konfiguration in bestimmten Situationen viel einfacher? Funktioniert man nicht gut mit mittlerer Sicherheit?

Dan Esparza
quelle
3
Ernsthaft LOL'ed bei 'Es fällt mir auch ein, dass ich die Unterschiede zwischen den beiden nicht verstehe.' Gute Frage, aber es würde nur dafür eine +1 verdienen :)
JohnIdol
2
:-) Vielen Dank. Ich finde es gut, ehrlich zu sein, was ich nicht weiß.
Dan Esparza
1
Ohne Fragen gäbe es keine Antworten .. :)
Sprintstar

Antworten:

70

Ein ASP.NET- HTTP-Handler ist der Prozess (häufig als "Endpunkt" bezeichnet), der als Antwort auf eine Anforderung an eine ASP.NET-Webanwendung ausgeführt wird. Der am häufigsten verwendete Handler ist ein ASP.NET-Seitenhandler, der ASPX-Dateien verarbeitet. Wenn Benutzer eine ASPX-Datei anfordern, wird die Anforderung von der Seite über den Seitenhandler verarbeitet. Sie können Ihre eigenen HTTP-Handler erstellen, die benutzerdefinierte Ausgaben für den Browser rendern.

Typische Verwendungszwecke für benutzerdefinierte HTTP-Handler sind:

  • RSS-Feeds Um einen RSS-Feed für eine Website zu erstellen, können Sie einen Handler erstellen, der RSS-formatiertes XML ausgibt. Sie können dann eine Dateinamenerweiterung wie .rss an den benutzerdefinierten Handler binden. Wenn Benutzer eine Anforderung an Ihre Site senden, die mit .rss endet, ruft ASP.NET Ihren Handler auf, um die Anforderung zu verarbeiten.
  • Bildserver Wenn eine Webanwendung Bilder in verschiedenen Größen bereitstellen soll, können Sie einen benutzerdefinierten Handler schreiben, um die Größe von Bildern zu ändern, und diese dann als Antwort des Handlers an den Benutzer senden.

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.

Typische Verwendungszwecke für HTTP-Module sind:

  • Sicherheit Da Sie eingehende Anforderungen untersuchen können, kann ein HTTP-Modul eine benutzerdefinierte Authentifizierung oder andere Sicherheitsüberprüfungen durchführen, bevor die angeforderte Seite, der XML-Webdienst oder der Handler aufgerufen wird. In Internet Information Services (IIS) 7.0, das im integrierten Modus ausgeführt wird, können Sie die Formularauthentifizierung auf alle Inhaltstypen in einer Anwendung erweitern.
  • Statistik und Protokollierung Da HTTP-Module bei jeder Anforderung aufgerufen werden, können Sie Anforderungsstatistiken und Protokollinformationen in einem zentralen Modul anstatt auf einzelnen Seiten erfassen.
  • Benutzerdefinierte Kopf- oder Fußzeilen Da Sie die ausgehende Antwort ändern können, können Sie Inhalte wie benutzerdefinierte Kopfzeileninformationen in jede Seite oder jede XML-Webdienstantwort einfügen.

Von: http://msdn.microsoft.com/en-us/library/bb398986.aspx

Ramani Sandeep
quelle
16

Wie hier angegeben , sind HttpModules einfache Klassen, die sich in die Anforderungsverarbeitungspipeline einbinden können, während sich HttpHandler von HttpModules nicht nur aufgrund ihrer Position in der Anforderungsverarbeitungspipeline unterscheiden, sondern auch, weil sie bestimmten Dateierweiterungen zugeordnet werden müssen.

Kirtan
quelle
Sie müssen einen Handler keiner Erweiterung zuordnen, wenn Sie in einem HttpModule explizit eine Klasse auflösen, die iHttpHandler
missaghi
@rizzle: Was meinst du mit "explizit in eine Klasse auflösen, die IHttpHandler implementiert"? Meinst du, das IHttpModule ist auch ein IHttpHandler?
3
@ Ryan: Im Modul können Sie eine Methode an das Ereignis HttpApplication.BeginRequest anhängen und ihm den von Ihnen ausgewählten Handler geben, unabhängig von der Dateierweiterung
missaghi
15

IHttpModuleWenn Sie viel mehr Kontrolle haben, können Sie im Grunde den gesamten Datenverkehr steuern, der an Ihre Webanwendung geleitet wird. IHttpHandlergibt Ihnen weniger Kontrolle (der Datenverkehr wird gefiltert, bevor er Ihren Handler erreicht), aber wenn dies für Ihre Anforderungen ausreicht, sehe ich keinen Grund, die zu verwenden IHttpModule.

Wie auch immer, es ist wahrscheinlich am besten, Ihre benutzerdefinierte Logik in einer separaten Klasse zu haben und dann einfach diese Klasse von entweder IHttpModuleoder zu verwenden IHttpHandler. Auf diese Weise müssen Sie sich nicht wirklich um die Wahl des einen oder anderen kümmern. In der Tat könnte man eine zusätzliche Klasse , die Geräte erstellen beide IHttpHandler und IHttpModuledann entscheiden , was , indem Sie sich zu verwenden , bei Web.config.

Igor Brejc
quelle
Vielen Dank, können Sie erklären, dass wir beispielsweise einem Webserver eine benutzerdefinierte Authentifizierung hinzufügen, um beispielsweise Remote-Anforderungen zu erfüllen, diese jedoch nicht für lokale Anforderungen verwenden?
fkl
5

Module sollen Ereignisse verarbeiten, die von der Anwendung ausgelöst werden, bevor und nachdem die Anforderung tatsächlich vom Handler verarbeitet wurde. Handler hingegen haben nicht die Möglichkeit, Anwendungsereignisse zu abonnieren und stattdessen einfach ihre ProcessRequest-Methode aufzurufen, um die "Hauptarbeit" der Verarbeitung einer bestimmten Anforderung zu erledigen.

Schauen Sie sich diese Dokumentation von Microsoft an (etwa auf halber Strecke im Abschnitt "Die Anforderung wird von der HttpApplication-Pipeline verarbeitet"):

http://msdn.microsoft.com/en-us/library/bb470252.aspx

In Schritt 15 können Sie sehen, wo der Handler die Möglichkeit zur Ausführung erhält. Alle Ereignisse vor und nach diesem Schritt können von Modulen abgefangen werden, nicht jedoch von Handlern.

Abhängig davon, welche spezifischen Funktionen Sie erreichen möchten, können Sie entweder einen Handler oder ein Modul verwenden, um einen Upload-Handler zu implementieren. Möglicherweise verwenden Sie sogar beide.

Möglicherweise sollten Sie einen bereits geschriebenen Upload-Handler verwenden.

Hier ist eine kostenlose und Open Source-Version:

http://www.brettle.com/neatupload

Hier ist eine kommerzielle:

http://krystalware.com/Products/SlickUpload/

Wenn Sie sich die Dokumentation zu NeatUpload ansehen, werden Sie feststellen, dass Sie ein Modul konfigurieren müssen.

Jason Diamond
quelle