Kurse:Middleware

Aus ahrensburg.city
Zur Navigation springen Zur Suche springen

Einführung in Middleware

Middleware ist eine Komponente, die in die Anwendungs-Pipeline eingebunden wird, um Anfragen (Requests) und Antworten (Responses) zu verarbeiten. Middlewares werden nacheinander verkettet und in der gleichen Reihenfolge ausgeführt, in der sie hinzugefügt werden.

Middleware kann ein Request-Delegate (anonyme Methode oder Lambda-Ausdruck) oder eine Klasse sein.

Middleware - Run

Die Erweiterungsmethode namens Run wird verwendet, um eine abschließende (terminating) / kurzschließende (short-circuiting) Middleware auszuführen, die die Anfrage nicht an die nächste Middleware weiterleitet.

<source lang="csharp"> app.Run( ); app.Run(async (HttpContext context) => { // Code }); </source>

Middleware-Kette

app.Use( )

Die Erweiterungsmethode namens Use wird verwendet, um eine nicht-abschließende Middleware auszuführen, die die Anfrage an die nächste Middleware weiterleiten kann oder auch nicht.

<source lang="csharp"> app.Use(async (HttpContext context, RequestDelegate next) => { // Logik davor await next(context); // Logik danach }); </source>

Middleware-Klasse

Eine Middleware-Klasse wird verwendet, um die Middleware-Logik von einem Lambda-Ausdruck in eine separate / wiederverwendbare Klasse auszulagern.

<source lang="csharp"> class MiddlewareClassName : IMiddleware { public async Task InvokeAsync(HttpContext context, RequestDelegate next) { // Logik davor await next(context); // Logik danach } }

// Registrierung in der Pipeline app.UseMiddleware<MiddlewareClassName>();

</source>

Middleware-Erweiterungen

Eine Middleware-Erweiterungsmethode wird verwendet, um die Middleware mit einem einzigen Methodenaufruf aufzurufen.

Middleware-Klasse:

<source lang="csharp"> class MiddlewareClassName : IMiddleware { public async Task InvokeAsync(HttpContext context, RequestDelegate next) { // Logik davor await next(context); // Logik danach } } </source>

Erweiterungsmethode:

<source lang="csharp"> static class ClassNameExtensions { public static IApplicationBuilder ExtensionMethodName(this IApplicationBuilder app) { return app.UseMiddleware<MiddlewareClassName>(); } }

// Aufruf in der Pipeline app.ExtensionMethodName();

</source>

Konventionelle Middleware

Eine konventionelle Middleware folgt einem Muster (Konstruktor mit einem RequestDelegate und eine InvokeAsync-Methode), anstatt die IMiddleware-Schnittstelle explizit zu implementieren.

<source lang="csharp"> class MiddlewareClassName { private readonly RequestDelegate _next;

public MiddlewareClassName(RequestDelegate next) { _next = next; }

public async Task InvokeAsync(HttpContext context) { // Logik davor await _next(context); // Logik danach } }

</source>

Erweiterungsmethode zur Registrierung:

<source lang="csharp"> static class ClassNameExtensions { public static IApplicationBuilder ExtensionMethodName(this IApplicationBuilder app) { return app.UseMiddleware<MiddlewareClassName>(); } }

// Aufruf in der Pipeline app.ExtensionMethodName();

</source>

Die richtige Reihenfolge der Middleware

Die Reihenfolge, in der Middleware-Komponenten zur Pipeline hinzugefügt werden, ist entscheidend, da sie die Verarbeitung von Anfragen und Antworten beeinflusst.

<source lang="csharp"> // Ausnahmebehandlung zuerst app.UseExceptionHandler("/Error");

// Erzwingt HTTPS app.UseHsts(); app.UseHttpsRedirection();

// Stellt statische Dateien bereit (z.B. HTML, CSS, Bilder) app.UseStaticFiles();

// Routing-Entscheidungen app.UseRouting();

// CORS-Richtlinien anwenden app.UseCors();

// Authentifizierung des Benutzers app.UseAuthentication();

// Autorisierung des Zugriffs auf Ressourcen app.UseAuthorization();

// Sitzungszustand verwalten app.UseSession();

// Endpunkte für Controller mappen app.MapControllers();

// Fügen Sie hier Ihre benutzerdefinierten Middlewares hinzu

// Eine abschließende Middleware am Ende app.Run();

</source>

Middleware - UseWhen

Die Erweiterungsmethode namens UseWhen wird verwendet, um einen Zweig der Middleware-Pipeline nur dann auszuführen, wenn die angegebene Bedingung wahr ist.

<source lang="csharp"> app.UseWhen( context => { return boolescher_Wert; }, // Bedingung appBuilder => { // Fügen Sie hier Ihre Middlewares für diesen Zweig hinzu appBuilder.Use(...); } ); </source>