Sobes.tech
Middle+

¿Cómo aplicas filtros en pipelines en C#? ¿Puedes dar ejemplos de su uso?

sobes.tech AI

Respuesta de la IA

Los filtros en los pipelines de C# se utilizan para interceptar e intervenir en diferentes etapas del procesamiento de una solicitud o la ejecución de una tarea. En aplicaciones web ASP.NET Core, permiten agregar lógica antes, después o durante la ejecución de los métodos de acción de los controladores, así como en otros niveles de procesamiento de solicitudes.

Ejemplos de uso de filtros en ASP.NET Core:

  1. Filtros de Autenticación y Autorización: Determinan si un usuario está autorizado para realizar una acción específica.

    // Ejemplo de atributo Authorize
    [Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
  2. Filtros de recursos: Se ejecutan primero después de los filtros de autorización. Pueden realizar caching o interrumpir el pipeline.

    // Ejemplo de filtro de recursos para caching
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Lógica antes de ejecutar la acción
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Lógica después de ejecutar la acción, pero antes de escribir la respuesta
        }
    }
    
  3. Filtros de acción: Se ejecutan antes y después del método de acción del controlador. Son útiles para validar datos, registrar logs o modificar parámetros y resultados.

    // Ejemplo de filtro de acción para logging
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Lógica antes de ejecutar la acción
            Console.WriteLine($"Ejecutando acción: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Lógica después de ejecutar la acción
            Console.WriteLine($"Acción ejecutada: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Aplicar filtro de acción a un método
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Filtros de excepciones: Manejan excepciones no controladas que ocurren durante la ejecución del método de acción u otros filtros.

    // Ejemplo de filtro de excepción para manejo de errores
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Lógica para manejar la excepción
            context.Result = new ContentResult()
            {
                Content = "Ocurrió un error.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Indica que la excepción ha sido manejada
        }
    }
    
    // Aplicar filtro de excepción a un controlador
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("¡Algo salió mal!");
        }
    }
    
  5. Filtros de resultados: Se ejecutan antes y después de la ejecución del método de resultado (por ejemplo, antes o después de ViewResult, JsonResult, etc.).

    // Ejemplo de filtro de resultado para modificar el resultado
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Lógica antes de ejecutar el método de resultado
            Console.WriteLine($"Ejecutando tipo de resultado: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Lógica después de ejecutar el método de resultado
            Console.WriteLine($"Tipo de resultado ejecutado: {context.Result.GetType().Name}");
        }
    }
    

Los filtros pueden aplicarse globalmente (para todas las solicitudes), a nivel de controlador o a nivel de método de acción específico. El orden de ejecución en el pipeline está determinado por su tipo.