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 emHttpContext.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!");
}
}