DevTrain

Autor: Hannes Preishuber

HTTP Behandlung selbstgemacht

Sie haben keinen Dr. Titel und wollen trotzdem jemanden behandeln? Wenn Sie nicht hinter Gittern landen wollen,  nehmen Sie sich doch HTTP vor!
Mit den HTTPHandlern von ASP .NET steht der Eröffnung Ihrer Praxis nichts mehr im Wege. Um nicht als Kurpfuscher zu enden, werfen wir nun doch einen Blick auf die Details.
HTTP Handler werden typischerweise einer File Extension zugeordnet. So könnte z.B. eine Datei default.ppedv einer speziellen Code Routine unterworfen werden.
 
HTTP Module sind in der Wirkung ähnlich, beziehen sich aber auf jeder Art von Request oder Response. Die HttpHandler Klassen finden sich im Namensraum System.Web und muss deshalb importiert werden. Als nächstes definieren Sie eine Klasse in der Sie das Interface IHttpHandler einbinden. Dieses Interface erfordert eine Methode namens ProcessRequest und die Eigenschaft IsReuseable. Da das Zeugs über ein Interface kommt, muss der eigentliche Code nun in Ihre Klasse eingebaut werden. In Anlehnung an das Beispiel aus dem Quickstart Tutorial schreiben wir in den Response Stream die Uhrzeit.
Imports System.Web
Public Class Handler1
    Implements IHttpHandler
    Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        context.Response.Write("Trace " & Date.Now.ToLongTimeString)
    End Sub
    Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        Get
            Return True
        End Get
    End Property
End Class
Nun muss diese Klasse auch irgendwie aktiviert werden. Alle Konfiguartionen werden in der Datei Web.Config vorgenommen. Für unseren HTTP Handler steht in der Sektion httpHandlers genügend Platz bereit um einen oder mehrere Handler einzubauen. So lässt sich über verb für GET und PIST oder beides das Verhalten festlegen. Die Zuweisung der Klasse erfolgt über Type. In unserem Beispiel befindet sich die Klasse Handler1 in der Webapplikation WebUI (Namensraum). Deshalb ist die schreibweise WebUI.Handler1 anzuwenden. Der Wert hinter dem Komma gibt den Namensraum an in dem sich die Klasse befindet. Über das Attribut Path wird festgelegt für welche Datei oder Dateigruppe die Behandlung angewendet wird.
<httpHandlers>
      <add verb="*" path="*.aspx" type="WebUI.Handler1,WebUI" />
</httpHandlers>

Neben dem Attribut Add gibt es noch Remove und Clear. Dies macht Sinn, da die Datei Web.Config mehrmals in der Dateihirarchie vorkommen kann und Sie so die Handler dynamsich hinzufügen oder entfernen können.
Der Effekt dieses Codes ist die Ausgabe der Uhrzeit. Unabghängig davon welche Seite aufgerufen wird und welchen Content diese hat, es erscheint nur die Uhrzeit. Also auch wenn es die Seite nicht gibt, immer das gleiche Ergebnis.
Wer sich mit der Architektur des IIS beschäftigt hat, wird sofort einwenden, das z.B. html Seiten nicht diesen Effekt erzeugen. Nur Dateitypen die von der ASP .NET Engine behandelt werden laufen durch den HTTPHandler. Sie können diese Mappings aber in der Anwendungskonfiguration vornehmen und so jeden beliebige (auch noch nicht existente) Extension der DLL zuordnen.
(%WINDOR%Microsoft.NETFrameworkv1.0.3705aspnet_isapi.dll).
HTTPModule
Ein HTTPModule ist vergleichbar mit einem ISAPI Filter und kümmert sich um jeden Request. Deshalb wird hier ein Beginn- und EndRequest eingebaut. Diese beiden Funktionen werden über einen Funktions Pointer (AddressOf) in der Init Methode deklariert.  Zum entladen dient die Dispose Methode.
Public Class Module1
    Implements IHttpModule
    Public Sub Init(ByVal app As HttpApplication) Implements IHttpModule.Init
        AddHandler app.BeginRequest, AddressOf ppBeginRequest
        AddHandler app.EndRequest, AddressOf ppEndRequest
    End Sub
    Public Sub Dispose() Implements IHttpModule.Dispose
    End Sub
    Public Sub ppBeginRequest(ByVal s As Object, ByVal e As EventArgs)
        Dim app As HttpApplication
        app = CType(s, HttpApplication)
        app.Response.Write("Starte Request<br>")
    End Sub
    Public Sub ppEndRequest(ByVal s As Object, ByVal e As EventArgs)
        Dim app As HttpApplication
        app = CType(s, HttpApplication)
        app.Response.Write("<br>Habe fertig!")
    End Sub
End Class

Wenn Sie ein HTTPModule in Betrieb nehmen wollen, wenden Sie sich an die Config.Web und dort wieder vertrauensvoll an den Bereich .... JA Richtig!.... httpModules. Dann wird ähnlich wie beim HTTP Handler die Klasse zugewiesen.
<httpModules>
 <add type="WebUI.Module1,WebUI" name="ppHttpModule" />
</httpModules>

Hier können auch wieder wie beim HTTPHandler mehrere Module unterkommen. Selbst die gleiche Klasse könnte mehrmals eingebaut werden, muss sich dann allerdings durch einen eindeutigen Namen unterscheiden.
<httpModules>
 <add type="WebUI.Module1,WebUI" name="ppHttpModule" />
  <add type="WebUI.Module1,WebUI" name="ppHttpModule2" />
</httpModules>
 
Was kann man nun mit diesen Wunderbaren Dingen anfangen? Z.B. eine eigene Authentifizierung implementieren oder einen ISAPI Filter ersetzen.
 
 

Erfasst am: 12.03.2002 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=725
© Copyright 2003 ppedv AG - http://www.ppedv.de