Sobes.tech
Middle

Какво е Action филтър и какви функции изпълнява?

sobes.tech AI

Отговор от AI

Action филтри в ASP.NET Core — това е специфичен тип филтри, който прихваща изпълнението на метода на действието на контролера.

Основни функции:

  • Преди изпълнение на действието: Изпълняват код преди да бъде извикан методът на действието на контролера (OnActionExecuting).
  • След изпълнение на действието: Изпълняват код след като методът на действието е бил извикан, но преди да бъде извършено форматирането на резултата (OnActionExecuted).
  • Модификация на контекста: Могат да променят контекста на изпълнение на действието (ActionExecutingContext) или контекста след изпълнение (ActionExecutedContext), например, добавяне на данни към HttpContext.Items, промяна на маршрутизацията или задаване на резултат от действието.
  • Обработка на изключения: Не обработват директно изключения, но могат да бъдат използвани за задаване на резултат при грешка, ако е възникнало изключение по време на OnActionExecuting.

Примери за използване:

  • Валидация на данните от заявката преди изпълнение на действието.
  • Добавяне на заглавки или модификация на тялото на отговора.
  • Логиране на информация за заявката и отговора.
  • Кеширане на резултатите от действието.
  • Изпълнение на авторизация и автентикация (макар че за това по-често се използват специализирани филтри за Authorization и Authentication).

Реализация: Създават се чрез наследяване от ActionFilterAttribute или чрез имплементиране на интерфейси IActionFilter (синхронен) или IAsyncActionFilter (асинхронен).

// Пример за прост синхронен Action филтър
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!");
    }
}