Sobes.tech
Middle

O que é um filtro de ação e quais funções ele realiza?

sobes.tech IA

Resposta da IA

Os filtros de ação no ASP.NET Core são um tipo específico de filtros que interceptam a execução do método de ação do controlador.

Funções principais:

  • Antes da execução da ação: Executam código antes de o método de ação do controlador ser chamado (OnActionExecuting).
  • Após a execução da ação: Executam código após o método de ação do controlador ter sido chamado, mas antes de o resultado ser formatado (OnActionExecuted).
  • Modificação do contexto: Podem modificar o contexto de execução da ação (ActionExecutingContext) ou o contexto após a execução (ActionExecutedContext), por exemplo, adicionando dados em HttpContext.Items, modificando o roteamento ou definindo o resultado da ação.
  • Tratamento de exceções: Não tratam exceções diretamente, mas podem ser usados para definir um resultado de erro se uma exceção ocorreu na fase OnActionExecuting.

Exemplos de uso:

  • Validação dos dados da requisição antes de chamar a ação.
  • Adição de cabeçalhos ou modificação do corpo da resposta.
  • Registo de informações sobre a requisição e resposta.
  • Cache de resultados da ação.
  • Realização de autorização e autenticação (embora para isso sejam usados filtros especializados de Autorização e Autenticação).

Implementação: São criados herdando de ActionFilterAttribute ou implementando as interfaces IActionFilter (síncrono) ou IAsyncActionFilter (assíncrono).

// Exemplo de filtro de ação simples e síncrono
public class CustomActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        // Lógica antes da execução da ação
        Console.WriteLine("Antes da execução da ação");
        base.OnActionExecuting(context);
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        // Lógica após a execução da ação
        if (context.Exception == null && context.Result is ObjectResult objectResult)
        {
            // Modificação do resultado se não houver exceção e o resultado for ObjectResult
            Console.WriteLine($"Código de estado do resultado da ação: {objectResult.StatusCode}");
        }
        Console.WriteLine("Após a execução da ação");
        base.OnActionExecuted(context);
    }
}

Aplicam-se a controladores ou métodos de ação específicos usando atributos:

[CustomActionFilter] // Aplicação ao controlador
public class HomeController : Controller
{
    [HttpGet]
    [CustomActionFilter] // Aplicação ao método de ação
    public IActionResult Index()
    {
        return Ok("Olá do Index!");
    }
}