Sobes.tech
Middle+

Jak stosujesz filtry w pipeline'ach w C#? Czy możesz podać przykłady ich użycia?

sobes.tech AI

Odpowiedź od AI

Filtry w potokach C# służą do przechwytywania i ingerowania na różnych etapach przetwarzania żądania lub wykonywania zadania. W aplikacjach webowych ASP.NET Core umożliwiają dodanie logiki przed, po lub podczas wykonywania metod akcji kontrolerów, a także na innych poziomach przetwarzania żądań.

Przykłady użycia filtrów w ASP.NET Core:

  1. Filtry uwierzytelniania i autoryzacji: Określają, czy użytkownik ma uprawnienia do wykonania określonej akcji.

    // Przykład atrybutu Authorize
    [Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
  2. Filtry zasobów: Są wykonywane jako pierwsze po filtrach autoryzacji. Mogą wykonywać cache'owanie lub przerywać potok.

    // Przykład filtra zasobów do cache'owania
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Logika przed wykonaniem akcji
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Logika po wykonaniu akcji, przed zapisaniem odpowiedzi
        }
    }
    
  3. Filtry akcji: Są wykonywane przed i po metodzie akcji kontrolera. Przydatne do walidacji danych, logowania lub modyfikacji parametrów i wyników.

    // Przykład filtra akcji do logowania
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Logika przed wykonaniem akcji
            Console.WriteLine($"Wykonywanie akcji: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Logika po wykonaniu akcji
            Console.WriteLine($"Wykonano akcję: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Zastosowanie filtra akcji do metody
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Filtry wyjątków: Obsługują nieobsłużone wyjątki występujące podczas wykonywania metody akcji lub innych filtrów.

    // Przykład filtra wyjątków do obsługi błędów
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Logika obsługi wyjątku
            context.Result = new ContentResult()
            {
                Content = "Wystąpił błąd.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Wskazuje, że wyjątek został obsłużony
        }
    }
    
    // Zastosowanie filtra wyjątków do kontrolera
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("Coś poszło nie tak!");
        }
    }
    
  5. Filtry wyników: Są wykonywane przed i po wykonaniu metody wyniku (np. przed lub po wykonaniu ViewResult, JsonResult itp.).

    // Przykład filtra wyniku do modyfikacji rezultatu
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Logika przed wykonaniem metody wyniku
            Console.WriteLine($"Wykonywany typ wyniku: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Logika po wykonaniu metody wyniku
            Console.WriteLine($"Wykonany typ wyniku: {context.Result.GetType().Name}");
        }
    }
    

Filtry mogą być stosowane globalnie (dla wszystkich żądań), na poziomie kontrolera lub na poziomie konkretnej metody akcji. Kolejność ich wykonywania w pipeline jest określana przez ich typ.