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:
-
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(); } } -
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 } } -
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(); } -
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!"); } } -
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.