Unter [1] habe ich ein paar einführende Worte zu Middleware-Komponenten in ASP.NET vNext verloren. Hier zeige ich nun eine Variante, wie der Entwickler eigene Middleware-Komponenten implementieren kann. Dazu kommt die Methode Use von IBuilder zum Einsatz. Da diese Methode nicht gerade handsam ist, kommt im nachfolgenden Listing die gleichnamige Erweiterungsmethode aus dem Namensraum Microsoft.AspNet.Builder zum Einsatz. Use erwartet ein asynchrones Delegate, welches zwei Parameter entgegen nimmt: An den ersten Parameter übergibt ASP.NET vNext den aktuellen HttpContext; an den zweiten eine Funktion, die die nächste registrierte Middleware-Komponente zur Ausführung bringt. Wie man es vom HttpContext gewohnt ist, liefert dieser Verweise auf Objekte, welche den aktuellen Vorgang beschreiben. Darunter befinden sich ein Request-Objekt, das die aktuelle Anfrage beschreibt, und ein Response-Objekt, das die aktuelle Antwort verkörpert.
Die Middleware im Listing verwendet diese Objekte, um herauszufinden, ob der Aufrufer einen gültigen Zugangs-Code übergeben hat. Ist dem nicht so, liefert sie über das Response-Objekt den Statuscode 401 (Unauthorized) sowie einen Kopfzeileneintrag, der darauf hinweist, wie sich der Benutzer zu erkennen geben kann, retour. Ansonsten bringt die betrachtete Middleware durch den Aufruf von next die nächste registrierte Middleware zur Ausführung.
app.Use(async (context, next) =>
{
string accessCode = context.Request.Query["accessCode"];
if (accessCode != "geheim")
{
context.Response.StatusCode = 401; // Unauthorized
context.Response.Headers.Append("WWW-Authenticate", "AccessCode");
// Hinweis: AccessCode ist kein offizieller Wert für WWW-Authenticate
}
else
{
await next();
}
});
Die Erweiterungsmethode Run, welche sich ebenfalls im Namensraum Microsoft.AspNet.Builder befindet, ist im Gegensatz zu Use für die letzte Middleware in der Aufrufkette gedacht. Aus diesem Grund nimmt sie einen Delegate entgegen, der nur einen HttpContext, jedoch keine next-Funktion erwartet. Das nächste Listing demonstriert den Einsatz von Run anhand einer einfachen Methode, welche über das Response-Objekt lediglich den Text Hello World retourniert. Zuvor gibt das betrachtete Beispiel über den Kopfzeileneintrag Content-Type an, dass der Aufrufer ein Text-Dokument (text/plain) erhält.
app.Run(async context =>
{
context.Response.ContentType = "text/plain";
await context.Response.WriteAsync("Hello world\n");
});
[1] http://www.softwarearchitekt.at/post/2014/09/26/middleware-in-asp-net-vnext-teil-1-uberblick.aspx