Sobes.tech
Middle+

Como você aplica filtros em pipelines em C#? Pode dar exemplos de seu uso?

sobes.tech IA

Resposta da IA

Os filtros nos pipelines C# são utilizados para interceptar e intervir em diferentes etapas do processamento de uma solicitação ou execução de uma tarefa. Em aplicações web ASP.NET Core, eles permitem adicionar lógica antes, depois ou durante a execução dos métodos de ação dos controladores, bem como em outros níveis de processamento de solicitações.

Exemplos de uso de filtros no ASP.NET Core:

  1. Filtros de Autenticação e Autorização: Determinam se um usuário está autorizado a realizar uma ação específica.

    // Exemplo de atributo Authorize
    [Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
  2. Filtros de recursos: São executados primeiro após os filtros de autorização. Podem realizar caching ou interromper o pipeline.

    // Exemplo de filtro de recursos para caching
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Lógica antes de executar a ação
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Lógica após executar a ação, mas antes de escrever a resposta
        }
    }
    
  3. Filtros de ação: São executados antes e depois do método de ação do controlador. São úteis para validar dados, fazer logging ou modificar parâmetros e resultados.

    // Exemplo de filtro de ação para logging
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Lógica antes de executar a ação
            Console.WriteLine($"Executando ação: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Lógica após executar a ação
            Console.WriteLine($"Ação executada: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Aplicar filtro de ação a um método
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Filtros de exceções: Gerenciam exceções não tratadas que ocorrem durante a execução do método de ação ou outros filtros.

    // Exemplo de filtro de exceção para tratamento de erros
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Lógica de tratamento de exceção
            context.Result = new ContentResult()
            {
                Content = "Ocorreu um erro.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Indica que a exceção foi tratada
        }
    }
    
    // Aplicar filtro de exceção ao controlador
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("Algo deu errado!");
        }
    }
    
  5. Filtros de resultados: São executados antes e depois da execução do método de resultado (por exemplo, antes ou depois de ViewResult, JsonResult, etc.).

    // Exemplo de filtro de resultado para modificar o resultado
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Lógica antes de executar o método de resultado
            Console.WriteLine($"Executando tipo de resultado: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Lógica após executar o método de resultado
            Console.WriteLine($"Tipo de resultado executado: {context.Result.GetType().Name}");
        }
    }
    

Os filtros podem ser aplicados globalmente (para todas as solicitações), a nível de controlador ou a nível de método de ação específico. A ordem de execução no pipeline é determinada pelo seu tipo.