Sobes.tech
Middle

Τι είναι το φίλτρο ενέργειας και ποιες λειτουργίες εκτελεί;

sobes.tech AI

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

Οι φίλτρα δράσης στο ASP.NET Core είναι ένας συγκεκριμένος τύπος φίλτρων που παρεμβαίνουν στην εκτέλεση της μεθόδου δράσης του ελεγκτή.

Βασικές λειτουργίες:

  • Πριν από την εκτέλεση της δράσης: Εκτελούν κώδικα πριν καλεστεί η μέθοδος δράσης του ελεγκτή (OnActionExecuting).
  • Μετά την εκτέλεση της δράσης: Εκτελούν κώδικα μετά την κλήση της μεθόδου δράσης, αλλά πριν διαμορφωθεί το αποτέλεσμα (OnActionExecuted).
  • Τροποποίηση του πλαισίου: Μπορούν να τροποποιήσουν το πλαίσιο εκτέλεσης της δράσης (ActionExecutingContext) ή το πλαίσιο μετά την εκτέλεση (ActionExecutedContext), π.χ., προσθέτοντας δεδομένα στα HttpContext.Items, αλλάζοντας τη δρομολόγηση ή ορίζοντας το αποτέλεσμα της δράσης.
  • Διαχείριση εξαιρέσεων: Δεν διαχειρίζονται άμεσα εξαιρέσεις, αλλά μπορούν να χρησιμοποιηθούν για να ορίσουν αποτέλεσμα σφάλματος αν προκύψει εξαίρεση στο στάδιο OnActionExecuting.

Παραδείγματα χρήσης:

  • Επικύρωση δεδομένων αιτήματος πριν από την κλήση της δράσης.
  • Προσθήκη επικεφαλίδων ή τροποποίηση του σώματος της απάντησης.
  • Καταγραφή πληροφοριών σχετικά με το αίτημα και την απάντηση.
  • Cache αποτελεσμάτων δράσης.
  • Εκτέλεση εξουσιοδότησης και πιστοποίησης (αν και για αυτό χρησιμοποιούνται εξειδικευμένα φίλτρα Authorization και Authentication).

Υλοποίηση: Δημιουργούνται κληρονομώντας από το ActionFilterAttribute ή υλοποιώντας τις διεπαφές IActionFilter (συγχρονισμένο) ή IAsyncActionFilter (ασύγχρονο).

// Παράδειγμα απλού συγχρονου φίλτρου δράσης
public class CustomActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        // Λογική πριν από την εκτέλεση της δράσης
        Console.WriteLine("Πριν από την εκτέλεση της δράσης");
        base.OnActionExecuting(context);
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        // Λογική μετά την εκτέλεση της δράσης
        if (context.Exception == null && context.Result is ObjectResult objectResult)
        {
            // Τροποποίηση αποτελέσματος αν δεν υπάρχει εξαίρεση και το αποτέλεσμα είναι ObjectResult
            Console.WriteLine($"Κωδικός κατάστασης αποτελέσματος δράσης: {objectResult.StatusCode}");
        }
        Console.WriteLine("Μετά την εκτέλεση της δράσης");
        base.OnActionExecuted(context);
    }
}

Εφαρμόζονται σε ελεγκτές ή συγκεκριμένες μεθόδους δράσης μέσω διακριτικών:

[CustomActionFilter] // Εφαρμογή σε ελεγκτή
public class HomeController : Controller
{
    [HttpGet]
    [CustomActionFilter] // Εφαρμογή σε μέθοδο δράσης
    public IActionResult Index()
    {
        return Ok("Γειά από το Index!");
    }
}