Sobes.tech
Middle+

Wie wenden Sie Filter in Pipelines in C# an? Können Sie Beispiele für deren Verwendung geben?

sobes.tech KI

Antwort von AI

Filter in C#-Pipelines werden verwendet, um auf verschiedenen Stufen der Anfrageverarbeitung oder Aufgaben-Ausführung abzufangen und einzugreifen. In ASP.NET Core-Webanwendungen ermöglichen sie das Hinzufügen von Logik vor, nach oder während der Ausführung von Controller-Aktionsmethoden sowie auf anderen Ebenen der Anfrageverarbeitung.

Beispiele für die Verwendung von Filtern in ASP.NET Core:

  1. Authentifizierungs- und Autorisierungsfilter: Bestimmen, ob ein Benutzer berechtigt ist, eine bestimmte Aktion auszuführen.

    // Beispiel für das Authorize-Attribut
    [Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
  2. Ressourcen-Filter: Werden zuerst nach den Autorisierungsfiltern ausgeführt. Können Caching durchführen oder den Pipeline unterbrechen.

    // Beispiel für einen Ressourcen-Filter für Caching
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Logik vor der Ausführung der Aktion
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Logik nach der Ausführung der Aktion, aber vor der Antwort
        }
    }
    
  3. Aktions-Filter: Werden vor und nach der Ausführung der Controller-Aktionsmethode ausgeführt. Nützlich für Datenvalidierung, Logging oder Modifikation von Parametern und Ergebnissen.

    // Beispiel für einen Aktions-Filter für Logging
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Logik vor der Ausführung der Aktion
            Console.WriteLine($"Ausführung der Aktion: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Logik nach der Ausführung der Aktion
            Console.WriteLine($"Ausgeführte Aktion: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Anwendung des Aktions-Filters auf eine Methode
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Ausnahme-Filter: Behandeln unbehandelte Ausnahmen, die während der Ausführung der Aktionsmethode oder anderer Filter auftreten.

    // Beispiel für einen Ausnahme-Filter zur Fehlerbehandlung
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Logik zur Behandlung der Ausnahme
            context.Result = new ContentResult()
            {
                Content = "Ein Fehler ist aufgetreten.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Gibt an, dass die Ausnahme behandelt wurde
        }
    }
    
    // Anwendung des Ausnahme-Filters auf einen Controller
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("Etwas ist schief gelaufen!");
        }
    }
    
  5. Ergebnis-Filter: Werden vor und nach der Ausführung der Ergebnis-Methode ausgeführt (z.B. vor oder nach der Ausführung von ViewResult, JsonResult usw.).

    // Beispiel für einen Ergebnis-Filter zur Modifikation des Ergebnisses
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Logik vor der Ausführung der Ergebnis-Methode
            Console.WriteLine($"Auszuführender Ergebnis-Typ: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Logik nach der Ausführung der Ergebnis-Methode
            Console.WriteLine($"Ausgeführter Ergebnis-Typ: {context.Result.GetType().Name}");
        }
    }
    

Filter können global (für alle Anfragen), auf Controller-Ebene oder auf Ebene einer bestimmten Aktionsmethode angewendet werden. Die Reihenfolge ihrer Ausführung im Pipeline wird durch ihren Typ bestimmt.