<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://mediawiki.wissen-ahrensburg.de/index.php?action=history&amp;feed=atom&amp;title=Webframeworkk%2FASP.NET_Core%2FMiddleware</id>
	<title>Webframeworkk/ASP.NET Core/Middleware - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.wissen-ahrensburg.de/index.php?action=history&amp;feed=atom&amp;title=Webframeworkk%2FASP.NET_Core%2FMiddleware"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Webframeworkk/ASP.NET_Core/Middleware&amp;action=history"/>
	<updated>2026-08-19T16:51:17Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Dokument</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Webframeworkk/ASP.NET_Core/Middleware&amp;diff=256&amp;oldid=prev</id>
		<title>imported&gt;Import: Version 181</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Webframeworkk/ASP.NET_Core/Middleware&amp;diff=256&amp;oldid=prev"/>
		<updated>2026-02-15T23:58:57Z</updated>

		<summary type="html">&lt;p&gt;Version 181&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&amp;#039;&amp;#039;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Dieses Tutorial erklärt das Konzept der Middleware in ASP.NET Core, wie sie funktioniert, wie man sie konfiguriert und wie man eigene Middleware-Komponenten erstellt. Es basiert auf den bereitgestellten Notizen und ergänzendem Expertenwissen.&lt;br /&gt;
&lt;br /&gt;
== Was ist Middleware? ==&lt;br /&gt;
&lt;br /&gt;
Middleware in ASP.NET Core ist eine Software-Pipeline, durch die jede HTTP-Anfrage (Request) und jede Antwort (Response) fließt. Man kann sich diese Pipeline wie eine Reihe von hintereinander geschalteten Rohren oder Ventilen vorstellen.&lt;br /&gt;
&lt;br /&gt;
Jede Middleware-Komponente hat drei Hauptaufgaben:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Untersuchen&amp;#039;&amp;#039;&amp;#039; der eingehenden Anfrage.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Bearbeiten&amp;#039;&amp;#039;&amp;#039; der Anfrage oder der Antwort.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Weiterleiten&amp;#039;&amp;#039;&amp;#039; an die nächste Middleware oder &amp;#039;&amp;#039;&amp;#039;Beenden&amp;#039;&amp;#039;&amp;#039; (Short-Circuit) der Pipeline.&lt;br /&gt;
&lt;br /&gt;
Dies ermöglicht eine saubere Modularisierung von Funktionen wie Authentifizierung, Logging, Fehlerbehandlung und Routing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
== Grundlagen: app.Use vs. app.Run ==&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei grundlegende Methoden, um Middleware zur Pipeline hinzuzufügen:&lt;br /&gt;
&lt;br /&gt;
=== 1. &amp;lt;code&amp;gt;app.Run&amp;lt;/code&amp;gt; (Terminale Middleware) ===&lt;br /&gt;
&lt;br /&gt;
Diese Methode fügt eine &amp;#039;&amp;#039;&amp;#039;terminale&amp;#039;&amp;#039;&amp;#039; Middleware hinzu. Das bedeutet, sie beendet die Pipeline. Es wird kein &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;-Delegat aufgerufen, und nachfolgende Middleware-Komponenten werden nicht ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;app.Run(async (context) =&amp;gt; {&lt;br /&gt;
    await context.Response.WriteAsync(&amp;quot;Ende der Pipeline&amp;quot;);&lt;br /&gt;
});&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Warnung: Wenn Sie zwei &amp;lt;code&amp;gt;app.Run&amp;lt;/code&amp;gt;-Aufrufe hintereinander haben, wird nur der erste ausgeführt!&lt;br /&gt;
&lt;br /&gt;
=== 2. &amp;lt;code&amp;gt;app.Use&amp;lt;/code&amp;gt; (Verkettbare Middleware) ===&lt;br /&gt;
&lt;br /&gt;
Diese Methode dient dazu, Aufgaben zu erledigen und dann (meistens) die nächste Komponente in der Kette aufzurufen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;app.Use(async (context, next) =&amp;gt; {&lt;br /&gt;
    // Logik VOR dem nächsten Middleware-Aufruf (Request)&lt;br /&gt;
    await context.Response.WriteAsync(&amp;quot;Hallo &amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    // Ruft die nächste Middleware auf&lt;br /&gt;
    await next(context); &lt;br /&gt;
    &lt;br /&gt;
    // Logik NACH dem nächsten Middleware-Aufruf (Response)&lt;br /&gt;
    // Hier können wir die Antwort noch bearbeiten, nachdem der Rest der Pipeline fertig ist.&lt;br /&gt;
});&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
== Die Reihenfolge der Middleware (The Middleware Order) ==&lt;br /&gt;
&lt;br /&gt;
Die Reihenfolge, in der Middleware in &amp;lt;code&amp;gt;Program.cs&amp;lt;/code&amp;gt; registriert wird, ist &amp;#039;&amp;#039;&amp;#039;entscheidend&amp;#039;&amp;#039;&amp;#039;. Die Pipeline wird in der Reihenfolge der Registrierung durchlaufen (für den Request) und in umgekehrter Reihenfolge wieder zurück (für die Response).&lt;br /&gt;
&lt;br /&gt;
=== Empfohlene Reihenfolge ===&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Exception Handler&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;UseDeveloperExceptionPage&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;UseExceptionHandler&amp;lt;/code&amp;gt;): Sollte ganz oben stehen, um Fehler aus jedem Teil der Pipeline abzufangen.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;HSTS &amp;amp;amp; HTTPS Redirection&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;UseHsts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;UseHttpsRedirection&amp;lt;/code&amp;gt;): Sicherheit geht vor.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Static Files&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;UseStaticFiles&amp;lt;/code&amp;gt;): Statische Dateien sollten schnell ausgeliefert werden, ohne unnötige Verarbeitung durch spätere Logik.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Routing&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;UseRouting&amp;lt;/code&amp;gt;): Ermittelt, welcher Endpunkt passt.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;CORS&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;UseCors&amp;lt;/code&amp;gt;): Cross-Origin Resource Sharing.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Authentication&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;UseAuthentication&amp;lt;/code&amp;gt;): Wer ist der Benutzer?&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Authorization&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;UseAuthorization&amp;lt;/code&amp;gt;): Darf der Benutzer das?&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Benutzerdefinierte Middleware&amp;#039;&amp;#039;&amp;#039;: Ihre eigene Logik.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Endpunkte&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;MapControllers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;UseEndpoints&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;app.Run&amp;lt;/code&amp;gt;): Die eigentliche Verarbeitung der Anfrage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
== Custom Middleware erstellen ==&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Hauptwege, eigene Middleware zu schreiben: als Klasse mit &amp;lt;code&amp;gt;IMiddleware&amp;lt;/code&amp;gt; (Factory-based) oder als konventionelle Klasse.&lt;br /&gt;
&lt;br /&gt;
=== 1. Middleware mit &amp;lt;code&amp;gt;IMiddleware&amp;lt;/code&amp;gt; (Factory-based) ===&lt;br /&gt;
&lt;br /&gt;
Diese Methode ist stark typisiert und nutzt Dependency Injection voll aus. Die Klasse muss im DI-Container registriert werden (z.B. als Transient).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;using Microsoft.AspNetCore.Http;&lt;br /&gt;
using System.Threading.Tasks;&lt;br /&gt;
&lt;br /&gt;
public class MyFactoryMiddleware : IMiddleware&lt;br /&gt;
{&lt;br /&gt;
    public async Task InvokeAsync(HttpContext context, RequestDelegate next)&lt;br /&gt;
    {&lt;br /&gt;
        await context.Response.WriteAsync(&amp;quot;Factory Middleware Start\n&amp;quot;);&lt;br /&gt;
        await next(context);&lt;br /&gt;
        await context.Response.WriteAsync(&amp;quot;Factory Middleware Ende\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Registrierung:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;// In Program.cs&lt;br /&gt;
builder.Services.AddTransient&amp;lt;MyFactoryMiddleware&amp;gt;();&lt;br /&gt;
// ...&lt;br /&gt;
app.UseMiddleware&amp;lt;MyFactoryMiddleware&amp;gt;();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== 2. Konventionelle Middleware ===&lt;br /&gt;
&lt;br /&gt;
Dies ist der häufigste Weg. Die Klasse benötigt kein Interface, muss aber einer bestimmten Struktur folgen:&lt;br /&gt;
&lt;br /&gt;
* Einen öffentlichen Konstruktor, der &amp;lt;code&amp;gt;RequestDelegate&amp;lt;/code&amp;gt; als Parameter nimmt.&lt;br /&gt;
* Eine Methode &amp;lt;code&amp;gt;Invoke&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;InvokeAsync&amp;lt;/code&amp;gt;, die &amp;lt;code&amp;gt;HttpContext&amp;lt;/code&amp;gt; nimmt und einen &amp;lt;code&amp;gt;Task&amp;lt;/code&amp;gt; zurückgibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;public class HelloCustomMiddleware&lt;br /&gt;
{&lt;br /&gt;
    private readonly RequestDelegate _next;&lt;br /&gt;
&lt;br /&gt;
    public HelloCustomMiddleware(RequestDelegate next)&lt;br /&gt;
    {&lt;br /&gt;
        _next = next;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public async Task InvokeAsync(HttpContext httpContext)&lt;br /&gt;
    {&lt;br /&gt;
        // Beispiel: Prüfen auf Query-Parameter&lt;br /&gt;
        if (httpContext.Request.Query.ContainsKey(&amp;quot;firstname&amp;quot;) &amp;amp;&amp;amp; &lt;br /&gt;
            httpContext.Request.Query.ContainsKey(&amp;quot;lastname&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            string fullName = $&amp;quot;{httpContext.Request.Query[\&amp;quot;firstname\&amp;quot;]} {httpContext.Request.Query[\&amp;quot;lastname\&amp;quot;]}&amp;quot;;&lt;br /&gt;
            await httpContext.Response.WriteAsync($&amp;quot;Hallo {fullName}\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // WICHTIG: Nächste Middleware aufrufen&lt;br /&gt;
        await _next(httpContext); &lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Extension Method für saubere Registrierung:&amp;#039;&amp;#039;&amp;#039; Es ist “Best Practice”, eine Extension-Methode für &amp;lt;code&amp;gt;IApplicationBuilder&amp;lt;/code&amp;gt; zu erstellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;public static class MiddlewareExtensions&lt;br /&gt;
{&lt;br /&gt;
    public static IApplicationBuilder UseHelloCustomMiddleware(this IApplicationBuilder builder)&lt;br /&gt;
    {&lt;br /&gt;
        return builder.UseMiddleware&amp;lt;HelloCustomMiddleware&amp;gt;();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Verwendung in Program.cs&lt;br /&gt;
app.UseHelloCustomMiddleware();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
== Bedingte Ausführung mit &amp;lt;code&amp;gt;UseWhen&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;UseWhen&amp;lt;/code&amp;gt; können Sie eine Verzweigung in der Pipeline erstellen, die nur unter bestimmten Bedingungen ausgeführt wird. Die Haupt-Pipeline wird danach wieder zusammengeführt (im Gegensatz zu &amp;lt;code&amp;gt;Map&amp;lt;/code&amp;gt;, das oft eine Sackgasse ist).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Syntax:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;app.UseWhen(&lt;br /&gt;
    context =&amp;gt; context.Request.Query.ContainsKey(&amp;quot;username&amp;quot;), // Bedingung (Predicate)&lt;br /&gt;
    appBuilder =&amp;gt; &lt;br /&gt;
    {&lt;br /&gt;
        // Diese Middleware läuft nur, wenn die Bedingung wahr ist&lt;br /&gt;
        appBuilder.Use(async (context, next) =&amp;gt;&lt;br /&gt;
        {&lt;br /&gt;
            await context.Response.WriteAsync(&amp;quot;Hallo vom Branch!\n&amp;quot;);&lt;br /&gt;
            await next();&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Szenarien für UseWhen:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Logging nur für bestimmte Pfade oder User.&lt;br /&gt;
* Spezielle Header nur für API-Requests setzen.&lt;br /&gt;
* Bedingte Diagnosetools.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Middleware&amp;#039;&amp;#039;&amp;#039; bildet das Rückgrat einer ASP.NET Core Anwendung.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Reihenfolge&amp;#039;&amp;#039;&amp;#039; ist wichtig: Von globalen Anliegen (Error Handling) zu spezifischen (Routing, Auth) zu Endpunkten.&lt;br /&gt;
* &amp;lt;code&amp;gt;app.Use&amp;lt;/code&amp;gt; kettet Komponenten aneinander, &amp;lt;code&amp;gt;app.Run&amp;lt;/code&amp;gt; beendet die Kette.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Custom Middleware&amp;#039;&amp;#039;&amp;#039; kann einfach als Klasse implementiert werden, um wiederverwendbare Logik zu kapseln.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* https://learn.microsoft.com/de-de/aspnet/core/fundamentals/middleware/&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;#039;&amp;#039;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>imported&gt;Import</name></author>
	</entry>
</feed>