Sobes.tech
Middle+

Πώς εφαρμόζετε φίλτρα σε pipelines σε C#; Μπορείτε να δώσετε παραδείγματα χρήσης;

sobes.tech AI

Απάντηση από AI

Οι φίλτρα στα C# pipelines χρησιμοποιούνται για την παρεμβολή και την επέμβαση σε διάφορα στάδια της επεξεργασίας του αιτήματος ή της εκτέλεσης εργασίας. Στις web εφαρμογές ASP.NET Core, επιτρέπουν την προσθήκη λογικής πριν, μετά ή κατά τη διάρκεια της εκτέλεσης των μεθόδων ενεργειών των ελεγκτών, καθώς και σε άλλα επίπεδα επεξεργασίας αιτημάτων.

Παραδείγματα χρήσης φίλτρων στο ASP.NET Core:

  1. Αυθεντικοποίηση και Εξουσιοδότηση (Authentication/Authorization Filters): Καθορίζουν αν ο χρήστης έχει την άδεια να εκτελέσει μια συγκεκριμένη ενέργεια.

    // Παράδειγμα του χαρακτηριστικού Authorize
    [Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
  2. Φίλτρα πόρων (Resource Filters): Εκτελούνται πρώτα μετά τα φίλτρα εξουσιοδότησης. Μπορούν να εκτελέσουν caching ή να διακόψουν την pipeline.

    // Παράδειγμα φίλτρου πόρων για caching
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Λογική πριν την εκτέλεση της μεθόδου δράσης
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Λογική μετά την εκτέλεση της μεθόδου δράσης, αλλά πριν την εγγραφή της απάντησης
        }
    }
    
  3. Φίλτρα ενεργειών (Action Filters): Εκτελούνται πριν και μετά την εκτέλεση της μεθόδου δράσης του ελεγκτή. Κατάλληλα για επικύρωση δεδομένων, καταγραφή ή τροποποίηση παραμέτρων και αποτελεσμάτων.

    // Παράδειγμα φίλτρου καταγραφής για logging
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Λογική πριν την εκτέλεση της ενέργειας
            Console.WriteLine($"Εκτέλεση ενέργειας: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Λογική μετά την εκτέλεση της ενέργειας
            Console.WriteLine($"Ενέργεια εκτελέστηκε: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Εφαρμογή φίλτρου ενεργειών σε μέθοδο ελεγκτή
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Φίλτρα εξαιρέσεων (Exception Filters): Διαχειρίζονται μη διαχειριζόμενες εξαιρέσεις που προκύπτουν κατά την εκτέλεση της μεθόδου δράσης ή άλλων φίλτρων.

    // Παράδειγμα φίλτρου εξαιρέσεων για επεξεργασία σφαλμάτων
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Λογική επεξεργασίας σφάλματος
            context.Result = new ContentResult()
            {
                Content = "Παρουσιάστηκε σφάλμα.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Υποδεικνύει ότι η εξαίρεση έχει διαχειριστεί
        }
    }
    
    // Εφαρμογή φίλτρου εξαιρέσεων σε ελεγκτή
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("Κάτι πήγε στραβά!");
        }
    }
    
  5. Φίλτρα αποτελεσμάτων (Result Filters): Εκτελούνται πριν και μετά την εκτέλεση της μεθόδου αποτελέσματος της ενέργειας (π.χ., πριν ή μετά την εκτέλεση ViewResult, JsonResult κ.λπ.).

    // Παράδειγμα φίλτρου αποτελέσματος για τροποποίηση του αποτελέσματος
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Λογική πριν την εκτέλεση της μεθόδου αποτελέσματος
            Console.WriteLine($"Εκτέλεση τύπου αποτελέσματος: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Λογική μετά την εκτέλεση της μεθόδου αποτελέσματος
            Console.WriteLine($"Τύπος αποτελέσματος που εκτελέστηκε: {context.Result.GetType().Name}");
        }
    }
    

Τα φίλτρα μπορούν να εφαρμοστούν παγκοσμίως (για όλες τις αιτήσεις), σε επίπεδο ελεγκτή ή σε επίπεδο συγκεκριμένης μεθόδου. Η σειρά εκτέλεσής τους καθορίζεται από τον τύπο τους.