Sobes.tech
Middle+

Hoe pas je filters toe in pipelines in C#? Kun je voorbeelden geven van het gebruik ervan?

sobes.tech AI

Antwoord van AI

In C#-pipelines worden filters gebruikt om op verschillende fasen van het verzoek of de taakuitvoering in te grijpen en te interveniëren. In ASP.NET Core-webapplicaties maken ze het mogelijk om logica toe te voegen vóór, na of tijdens de uitvoering van controlleractie-methoden, evenals op andere niveaus van verzoekverwerking.

Voorbeelden van het gebruik van filters in ASP.NET Core:

  1. Authenticatie en Autorisatie (Authentication/Authorization Filters): Bepalen of een gebruiker gemachtigd is om een bepaalde actie uit te voeren.

    // Voorbeeld van de Authorize-attribuut
    [Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
  2. Resource-filters (Resource Filters): Worden als eerste uitgevoerd na autorisatie-filters. Ze kunnen caching uitvoeren of de pijplijn onderbreken.

    // Voorbeeld van een resource-filter voor caching
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Logica vóór de uitvoering van de Actie
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Logica na de uitvoering van de Actie, maar vóór het schrijven van het antwoord
        }
    }
    
  3. Actie-filters (Action Filters): Worden vóór en na de uitvoering van de actie-methode van de controller uitgevoerd. Geschikt voor gegevensvalidatie, logging of het aanpassen van parameters en resultaten.

    // Voorbeeld van een Action Filter voor logging
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Logica vóór de uitvoering van de actie
            Console.WriteLine($"Actie wordt uitgevoerd: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Logica na de uitvoering van de actie
            Console.WriteLine($"Actie uitgevoerd: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Toepassen van het Action Filter op een controller-methode
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Exception-filters (Exception Filters): Behandelen onhandige uitzonderingen die optreden tijdens de uitvoering van een actie-methode of andere filters.

    // Voorbeeld van een Exception Filter voor foutafhandeling
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Logica voor het afhandelen van de uitzondering
            context.Result = new ContentResult()
            {
                Content = "Er is een fout opgetreden.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Aangeeft dat de uitzondering is afgehandeld
        }
    }
    
    // Toepassen van het Exception Filter op een controller
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("Er is iets misgegaan!");
        }
    }
    
  5. Result-filters (Result Filters): Worden vóór en na de uitvoering van de resultaat-methode van de actie uitgevoerd (bijvoorbeeld vóór of na het uitvoeren van ViewResult, JsonResult, enzovoort).

    // Voorbeeld van een Result Filter voor het aanpassen van het resultaat
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Logica vóór de uitvoering van de Result-methode
            Console.WriteLine($"Resultaat-type wordt uitgevoerd: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Logica na de uitvoering van de Result-methode
            Console.WriteLine($"Resultaat-type uitgevoerd: {context.Result.GetType().Name}");
        }
    }
    

Filters kunnen globaal worden toegepast (voor alle verzoeken), op controller-niveau of op specifiek methodeniveau. De volgorde van uitvoering in de pijplijn wordt bepaald door hun type.