Filtros en API Controllers de ASP.NET Core

Cuando construimos nuestras Web Apis normalmente necesitamos manipular las solicitudes entrantes y a las respuestas devueltas de nuestros clientes. A veces debemos agregar validaciones o logs que se repiten en varios de los métodos de nuestros controllers. ¡Y como a todo programador, no nos gusta repetir código! Para ello sacaremos provecho de los Filters que nos provee ASP.NET Core.

Ciclo de Pipelines

Lo primero que debemos tener en cuenta es que cuando llega un request a nuestro controller, éste pasa por una secuencia de middlewares y pipelines. En nuestro caso, los filtros se ejecutan en el Filter Pipeline. El orden cuando hacemos uso de estos pipelines es muy importante ya que como dijimos es una secuencia, es decir, que el request pasará por cada uno de ellos, y cuando se obtenga una respuesta volverá a pasar por cada uno en el orden inverso.

Dado que nuestros controllers realizan una acción, podemos separar el contexto en dos: antes (OnExecuting) y después (OnExecuted) de su ejecución. Es decir que podemos agregar lógica sobre un request entrante, por ejemplo, leer valores de su header, body y otros atributos que vengan con él. Y también a la respuesta que haya generado el controlador.

Tipo de filtros

  1. Filtros de autorización: son los primeros que se ejecutan y cortan el flujo si el usuario no está autorizado. Es muy recomendable utilizar los provistos por ASP.NET Core.
  2. Filtros de recursos: utilizados normalmente antes de realizar validaciones en el modelo. Se suele usar para controlar valores en el header.
  3. Filtros de acción: se ejecutan en el llamado y respuesta de un método del controlador. Muy común usarlo para validaciones del modelo y retornar una respuesta de error específica. O si necesitamos personalizar el resultado generada por el controlador.
  4. Filtros de excepción: muy útiles para atrapar excepciones globales y retornar un mensaje más amigable que todo el trace de la excepción. Sólo podremos utilizar OnException, dado que la excepción es algo que ya ocurrió.
  5. Filtros de resultado: se ejecutan sólo si el resultado es exitoso y son útiles para personalizar la respuesta al cliente. Sólo podremos utilizar OnExecuting, dado que la respuesta ya fue generada.

Cómo los usamos

Podemos crear una clase que implemente alguna de las interfaces de filtros:

Luego debemos en nuestro Startup.cs:

Y finalmente decoramos nuestros métodos donde queremos aplicar los filtros.

Conclusión

Sin dudas los filtros son una herramienta muy cómoda para agregar lógica a través de nuestra aplicación. Podemos usar filtros particulares en cada controlador, y filtros globales como por ejemplo atrapar las excepciones inesperadas, o darle algún formato particular al resultado devuelto. Pero debemos tener en cuenta el orden de ejecución de estos filtros ya que podría cortar el flujo de la petición.

Comentarios

Entradas más populares de este blog

Mejorando la productividad en nuestros Pull Request de Azure Repos