ASP.NET Core - Teil 2: die Middleware
Bereit bei ASP.NET 4 konnte man mit Hilfe von OWIN - Open Web Interface for .NET - Middleware-Implementierungen sehr einfach und robust umsetzen. Middlewares bieten hier eine Pipeline, sodass verschiedene Middleware nichts voneinander wissen müssen; Requests und Responses aber mit einem Pipeline-Prinzip abgearbeitet werden können.
ASP.NET Core hat dieses Pipeline-System sehr ähnlich übernommen; jedoch vereinfacht und weiter verbessert.
Beispiel Middleware: Logging jedes Requests
Dank dem Pipeline-Machanismus in ASP.NET Core ist es sehr einfach eine eigene Middleware zu schreiben. Folgendes Snippet macht nichts anderes, als jeden Requests zu loggen:
public class LogMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
public LogMiddleware( RequestDelegate next, ILoggerFactory lf )
{
_next = next;
_logger = lf.CreateLogger< LogMiddleware >( );
}
public async Task Invoke(HttpContext context)
{
_logger.Log($"Request: {context.Request.Path}");
await _next.Invoke(context);
_logger.Log("Done.");
}
}
Registriert wird die Middleware in der Startup-Klasse:
class Startup
{
public void Configure( IApplicationBuilder app )
{
app.UseMiddleware< LogMiddleware >( );
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
}
Die Reigenfolge der Middleware bei der Registrierung bestimmt auch die Reihenfolge der Abarbeitung. In diesem Fall wird die Logging Middleware vor dem Hello-World Output registriert; die Logging Middleware damit auch vorher ausgeführt.
Jede Middleware erhält als Parameter die Middleware, die im Anschluss erfolgt: public LogMiddleware( RequestDelegate next, ILoggerFactory lf )
Daher muss die eigene Middleware die nächste Middleware aktiv mit await _next.Invoke(context);
antriggern.