
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:
1public class LogMiddleware
2{
3 private readonly RequestDelegate _next;
4 private readonly ILogger _logger;
5
6 public LogMiddleware( RequestDelegate next, ILoggerFactory lf )
7 {
8 _next = next;
9 _logger = lf.CreateLogger< LogMiddleware >( );
10 }
11
12 public async Task Invoke(HttpContext context)
13 {
14 _logger.Log($"Request: {context.Request.Path}");
15
16 await _next.Invoke(context);
17
18 _logger.Log("Done.");
19 }
20}
Registriert wird die Middleware in der Startup-Klasse:
1class Startup
2{
3 public void Configure( IApplicationBuilder app )
4 {
5 app.UseMiddleware< LogMiddleware >( );
6
7 app.Run(async (context) =>
8 {
9 await context.Response.WriteAsync("Hello World!");
10 });
11 }
12}
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.

Comments