Πώς εφαρμόζετε φίλτρα σε pipelines σε C#; Μπορείτε να δώσετε παραδείγματα χρήσης;
sobes.tech AI
Απάντηση από AI
Οι φίλτρα στα C# pipelines χρησιμοποιούνται για την παρεμβολή και την επέμβαση σε διάφορα στάδια της επεξεργασίας του αιτήματος ή της εκτέλεσης εργασίας. Στις web εφαρμογές ASP.NET Core, επιτρέπουν την προσθήκη λογικής πριν, μετά ή κατά τη διάρκεια της εκτέλεσης των μεθόδων ενεργειών των ελεγκτών, καθώς και σε άλλα επίπεδα επεξεργασίας αιτημάτων.
Παραδείγματα χρήσης φίλτρων στο ASP.NET Core:
-
Αυθεντικοποίηση και Εξουσιοδότηση (Authentication/Authorization Filters): Καθορίζουν αν ο χρήστης έχει την άδεια να εκτελέσει μια συγκεκριμένη ενέργεια.
// Παράδειγμα του χαρακτηριστικού Authorize [Authorize] public class HomeController : Controller { public IActionResult Index() { return View(); } } -
Φίλτρα πόρων (Resource Filters): Εκτελούνται πρώτα μετά τα φίλτρα εξουσιοδότησης. Μπορούν να εκτελέσουν caching ή να διακόψουν την pipeline.
// Παράδειγμα φίλτρου πόρων για caching public class CacheResourceFilter : IResourceFilter { public void OnResourceExecuting(ResourceExecutingContext context) { // Λογική πριν την εκτέλεση της μεθόδου δράσης } public void OnResourceExecuted(ResourceExecutedContext context) { // Λογική μετά την εκτέλεση της μεθόδου δράσης, αλλά πριν την εγγραφή της απάντησης } } -
Φίλτρα ενεργειών (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(); } -
Φίλτρα εξαιρέσεων (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("Κάτι πήγε στραβά!"); } } -
Φίλτρα αποτελεσμάτων (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}"); } }
Τα φίλτρα μπορούν να εφαρμοστούν παγκοσμίως (για όλες τις αιτήσεις), σε επίπεδο ελεγκτή ή σε επίπεδο συγκεκριμένης μεθόδου. Η σειρά εκτέλεσής τους καθορίζεται από τον τύπο τους.