Verwendung von Aktionsfiltern in ASP.NET Core MVC

Mit Filtern in ASP.NET Core MVC können wir Code vor oder nach bestimmten Phasen der Anforderungsverarbeitungspipeline ausführen. Die verschiedenen Filtertypen entsprechen den verschiedenen Phasen der Pipeline, von der Autorisierung bis zur Ergebnisausführung.

Beispielsweise können Sie Aktionsfilter in ASP.NET Core MVC nutzen, um benutzerdefinierten Code vor und nach der Ausführung einer Aktionsmethode auszuführen. In diesem Artikel werden die in ASP.NET Core MVC integrierten Filter erläutert, warum sie nützlich sind und wie wir Aktionsfilter in unseren ASP.NET Core-Anwendungen verwenden können.

Filter in ASP.NET Core MVC

ASP.NET Core MVC enthält viele integrierte Filter. Dazu gehören die folgenden:

  • ActionFilter. Diese werden vor und nach der Ausführung einer Aktionsmethode eines Controllers ausgeführt. 
  • AuthorizationFilters. Diese Filter werden am Anfang der Anforderungspipeline ausgeführt. Sie werden verwendet, um die Anmeldeinformationen eines Benutzers zu überprüfen und zu überprüfen, ob der Benutzer autorisiert ist. 
  • ResourceFilters. Diese Filter werden nach der Autorisierung und vor der Modellbindung ausgeführt. Sie können ResourceFilters nutzen, um das Caching zu implementieren. 
  • Ergebnisfilter. Diese Filter werden verwendet, um Code vor und nach der Ausführung des IActionResult einer Aktionsmethode auszuführen. 
  • ExceptionFilters. Diese Filter werden verwendet, um alle in der Pipeline auftretenden Ausnahmen zu behandeln. Sie können ExceptionFilters nutzen, um benutzerdefinierten Code auszuführen, wenn eine Ausnahme aufgetreten ist. 

Die Wahl des zu verwendenden Filtertyps hängt davon ab, was Sie erreichen möchten. Wenn Sie beispielsweise versuchen, eine Anforderung kurzzuschließen (dh die Ausführung einer Aktionsmethode zu stoppen und ein Ergebnis vorzeitig zurückzugeben), verwenden Sie einen Ressourcenfilter. Wenn Sie alternativ versuchen, die Parameter der Aktionsmethode und das von der Aktionsmethode zurückgegebene Ergebnis zu ändern, verwenden Sie alternativ einen Aktionsfilter.

Die ActionFilterAttribute-Klasse implementiert die Schnittstellen IActionFilter, IAsyncActionFilter, IResultFilter, IAsyncResultFilter und IOrderedFilter. Sie können diese Klasse nutzen, um einen Methodenfilter, einen Controller-Filter oder einen globalen Filter zu implementieren. Wir werden dies später in diesem Artikel untersuchen.

Erstellen Sie ein ASP.NET Core-Web-API-Projekt in Visual Studio 2017

Zunächst erstellen wir ein ASP.NET Core-Web-API-Projekt in Visual Studio. Wenn Visual Studio 2017 auf Ihrem System ausgeführt wird, führen Sie die folgenden Schritte aus, um ein ASP.NET Core MVC-Projekt zu erstellen.

  1. Starten Sie die Visual Studio 2017-IDE.
  2. Klicken Sie auf Datei> Neu> Projekt.
  3. Wählen Sie "ASP.NET Core-Webanwendung (.NET Core)" aus der Liste der angezeigten Vorlagen.
  4. Geben Sie einen Namen für das Projekt an.
  5. Klicken Sie auf OK, um das Projekt zu speichern.
  6. Ein neues Fenster, "Neue .NET Core-Webanwendung ...", wird angezeigt.
  7. Wählen Sie .NET Core als Laufzeit und ASP.NET Core 2.1 (oder höher) aus der Dropdown-Liste oben aus.
  8. Wählen Sie als Projektvorlage „Webanwendung (Model-View-Controller)“. 
  9. Stellen Sie sicher, dass die Kontrollkästchen "Docker-Unterstützung aktivieren" und "Für HTTPS konfigurieren" deaktiviert sind. Wir werden diese Funktionen hier nicht verwenden.
  10. Stellen Sie sicher, dass "Keine Authentifizierung" ausgewählt ist. Wir werden auch hier keine Authentifizierung verwenden. 

Dadurch wird ein neues ASP.NET Core MVC-Projekt in Visual Studio erstellt. In diesem Projekt werden wir unsere Aktionsfilter in den folgenden Abschnitten implementieren.

Erstellen Sie einen benutzerdefinierten Aktionsfilter in ASP.NET Core MVC

Sie können benutzerdefinierte Aktionsfilter verwenden, um wiederverwendbaren Code vor oder nach der Ausführung einer Aktionsmethode auszuführen. Sie können die folgenden abstrakten Basisklassen erweitern, um benutzerdefinierte Filter zu erstellen. Beachten Sie, dass jede dieser abstrakten Klassen die Attributklasse erweitert.

  • ActionFilterAttribute
  • ResultFilterAttribute
  • ExceptionFilterAttribute
  • ServiceFilterAttribute
  • TypeFilterAttribute

Sie können auch die IActionFilter-Schnittstelle erweitern und ihre Methoden implementieren, um einen benutzerdefinierten Filter zu erstellen. Sie können sowohl synchrone als auch asynchrone Filter erstellen.

Erstellen Sie einen synchronen Aktionsfilter in ASP.NET Core MVC

Das folgende Codeausschnitt zeigt, wie ein synchroner Aktionsfilter erstellt werden kann, indem die IActionFilter-Schnittstelle erweitert und die Methoden OnActionExecuting und OnActionExecuted implementiert werden.

öffentliche Klasse SimpleActionFilter: IActionFilter

    {

        public void OnActionExecuting (ActionExecutingContext-Kontext)

        {

            // Diese Methode wird vor der Ausführung einer Aktionsmethode ausgeführt 

        }}

        public void OnActionExecuted (ActionExecutedContext-Kontext)

        {

            // Diese Methode wird ausgeführt, nachdem eine Aktionsmethode ausgeführt wurde 

        }}

    }}

Erstellen Sie einen asynchronen Aktionsfilter in ASP.NET Core MVC

Um einen asynchronen Aktionsfilter zu erstellen, können Sie die IAsyncActionFilter-Schnittstelle erweitern und die OnActionExecutionAsync-Methode implementieren, wie im folgenden Codeausschnitt gezeigt.

öffentliche Klasse SimpleAsyncActionFilter: IAsyncActionFilter

    {

        öffentliche asynchrone Aufgabe OnActionExecutionAsync (ActionExecutingContext-Kontext,

          ActionExecutionDelegate weiter)

        {

            // Der hier geschriebene Code wird vor der Ausführung einer Aktionsmethode ausgeführt 

            warte auf next ();

            // Der hier geschriebene Code wird nach Ausführung einer Aktionsmethode ausgeführt 

        }}

    }}

Fügen Sie einen Aktionsfilter in der ConfigureServices-Methode in ASP.NET Core hinzu

Sie können Filter auf verschiedenen Ebenen hinzufügen. Dazu gehören der Aktionsbereich, der Controller-Bereich und der globale Bereich. Das folgende Codeausschnitt zeigt, wie Sie einen Filter im globalen Bereich hinzufügen können. Beachten Sie, wie der oben implementierte benutzerdefinierte Aktionsfilter der Filtersammlung in der ConfigureServices-Methode der Startup-Klasse hinzugefügt wird. Beachten Sie, dass der Filter der Filtersammlung nach Instanz hinzugefügt wird.

services.AddMvc (Optionen =>

            {

                options.Filters.Add (neuer SimpleAsyncActionFilter ());

            }). SetCompatibilityVersion (CompatibilityVersion.Version_2_1);

Sie können den Filter auch nach Typ hinzufügen, wie im folgenden Codeausschnitt gezeigt.

services.AddMvc (Optionen =>

            {

                options.Filters.Add (typeof (SimpleAsyncActionFilter));

            }). SetCompatibilityVersion (CompatibilityVersion.Version_2_1);

Mit Filtern können Sie Code vor oder nach einem bestimmten Punkt in der Anforderungsverarbeitungspipeline ausführen. Eine der großen neuen Verbesserungen bei Aktionsfiltern in ASP.NET Core MVC ist die Möglichkeit, die Ausführungsreihenfolge des Filters in der HTTP-Anforderungspipeline anzugeben. Wir werden diese und viele weitere Funktionen von Filtern in ASP.NET Core MVC in einem kommenden Beitrag untersuchen.