Sobes.tech
Middle

Čo je Action filter a aké funkcie plní?

sobes.tech AI

Odpoveď od AI

Akčné filtre v ASP.NET Core — je špecifický typ filtrov, ktorý zachytáva vykonávanie metódy akcie kontroléra.

Hlavné funkcie:

  • Pred vykonaním akcie: Vykonávajú kód pred volaním metódy akcie (OnActionExecuting).
  • Po vykonaní akcie: Vykonávajú kód po tom, čo bola metóda akcie volaná, ale pred formátovaním výsledku (OnActionExecuted).
  • Modifikácia kontextu: Môžu meniť kontext vykonávania akcie (ActionExecutingContext) alebo kontext po vykonaní (ActionExecutedContext), napríklad pridávaním dát do HttpContext.Items, zmenou routingu alebo nastavovaním výsledku akcie.
  • Spracovanie výnimiek: Priamo nespracovávajú výnimky, ale môžu byť použité na nastavenie výsledku v prípade chyby, ak došlo k výnimke počas OnActionExecuting.

Príklady použitia:

  • Validácia dát požiadavky pred volaním akcie.
  • Pridanie hlavičiek alebo modifikácia tela odpovede.
  • Logovanie informácií o požiadavke a odpovedi.
  • Cacheovanie výsledkov akcie.
  • Vykonávanie autorizácie a autentifikácie (hoci na to sa častejšie používajú špecializované filtry Authorization a Authentication).

Implementácia: Sú vytvárané dedičstvom od ActionFilterAttribute alebo implementáciou rozhraní IActionFilter (synchronný) alebo IAsyncActionFilter (asynchrónny).

// Príklad jednoduchého synchronného akčného filtra
public class CustomActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        // Logika pred vykonaním akcie
        Console.WriteLine("Pred vykonaním akcie");
        base.OnActionExecuting(context);
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        // Logika po vykonaní akcie
        if (context.Exception == null && context.Result is ObjectResult objectResult)
        {
            // Modifikácia výsledku, ak nie je výnimka a výsledok je ObjectResult
            Console.WriteLine($"Stavový kód výsledku akcie: {objectResult.StatusCode}");
        }
        Console.WriteLine("Po vykonaní akcie");
        base.OnActionExecuted(context);
    }
}

Používajú sa na kontroléroch alebo samostatných metódach akcií pomocou atribútov:

[CustomActionFilter] // Použitie na kontroléri
public class HomeController : Controller
{
    [HttpGet]
    [CustomActionFilter] // Použitie na metóde akcie
    public IActionResult Index()
    {
        return Ok("Ahoj z Index!");
    }
}