ASP.NET Core - Teil 2: die Middleware

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.