asp.net Core Middleware gegen Filter

88

Nachdem ich über asp.net Core Middlware gelesen habe, bin ich verwirrt, wann ich Filter verwenden sollte und wann ich Middleware verwenden sollte, da sie das gleiche Ziel zu erreichen scheinen. Wann sollten Middlewares anstelle von Fitlern verwendet werden?

Arvand
quelle
1
Diese Dokumentation zielt auf diese spezielle Frage ab. docs.microsoft.com/en-us/aspnet/core/mvc/controllers/…
Nkosi

Antworten:

83

Es gibt ein Video dazu auf Kanal 9: ASP.NET Monsters # 91: Middleware vs. Filter . Um das Video zusammenzufassen:

Die Ausführung der Anfrage beginnt und wir haben eine Middleware und eine andere Middleware. Stellen Sie sich das wie die "russischen Puppen in Puppen" vor. Schließlich wird die Routing-Middleware aktiviert und die Anfrage geht in die MVC-Pipline. Geben Sie hier die Bildbeschreibung ein Wenn Sie also nicht den Kontext von MVC benötigen (nehmen wir an, Sie sind besorgt über den Ablauf und die Ausführung, z. B. das Reagieren auf Header, einen Vor-Routing-Mechanismus usw.), verwenden Sie Middleware .
Wenn Sie jedoch den Kontext von MVC benötigen und gegen Aktionen arbeiten möchten, verwenden Sie Filter .

Arvand
quelle
Wenn ich also eine Logik habe, die ich bei jeder Anforderung ausführen möchte (z. B. Protokollierung), von der nur einige MVC-bezogen sind, würde ich diese in die Middleware einfügen und dann den Filter-Handler die dafür erforderliche Logik ausführen lassen zur Middleware zurückwerfen?
Terry H
69

Middleware arbeitet auf der Ebene von ASP.NET Core und kann auf jede einzelne Anforderung reagieren, die in die Anwendung eingeht.

MVC-Filter werden dagegen nur für Anforderungen ausgeführt, die an MVC gesendet werden.

Wenn ich beispielsweise erzwingen möchte, dass alle Anforderungen über HTTPS ausgeführt werden müssen, müsste ich dafür eine Middleware verwenden. Wenn ich einen MVC-Filter erstellen würde, der dies tut, könnten Benutzer weiterhin z. B. statische Dateien über HTTP anfordern.

Andererseits könnte etwas, das Anforderungsdauern in MVC-Controllern protokolliert, absolut ein Aktionsfilter sein.

Juunen
quelle
5

Die Ausführung von middlewareerfolgt, bevor der MVC-Kontext in der Pipeline verfügbar wird. Das heißt, middlewarehat beispielsweise bei einem ActionFilter keinen Zugriff auf das ActionExecutingContextoder das ActionExecutedContext. Sie haben Zugriff auf das HttpContext, mit dem Sie sowohl Aktionen für die Anforderung als auch für die Antwort ausführen können. Da die Modellbindung noch nicht erfolgt ist, ist die Verwendung von Middleware nicht zum Ausführen einer Validierungsfunktion oder zum Ändern von Werten geeignet. Middlewarewird auch bei jeder Anforderung ausgeführt, unabhängig davon, welcher Controller oder welche Aktion aufgerufen wird.

Auf der anderen Seite filterswird nur auf bestimmten Aktionen und Controllern ausgeführt, es sei denn, Sie registrieren den Filter global beim Start. Da Sie vollen Zugriff auf den Kontext haben, können Sie auch auf den Controller und die Aktion selbst zugreifen.

Quelle und Beispiel: dotnetcultist.com

Majid Parvin
quelle