Action Filters en ASP.Net MVC
¿Qué son los Action Filters?
- Los filtros de acción se utilizan generalmente para aplicar problemas transversales como el registro, el almacenamiento en caché, la autorización, etc.
- El filtro de acción se puede registrar como otros filtros a nivel global, controlador o método de acción.
- Ejecutan código inmediatamente antes y después de llamar a un método de acción.
- El atributo de filtro de acción personalizado se puede crear derivando la clase ActionFilterAttribute o implementando la interfaz IActionFilter y la clase abstracta FilterAttribute.
- Pueden cambiar los argumentos pasados a una acción.
- Pueden cambiar el resultado devuelto de la acción.
- No se admiten en Razor Pages.
- Cada filtro de acción debe anular los métodos :
- OnActionExecuting: se llama a este método antes de que se ejecute una acción de controlador.
- OnActionExecuted: se llama a este método después de que se ejecute una acción de controlador.
- OnResultExecuting: se llama a este método antes de que se ejecute un resultado de acción de controlador.
- OnResultExecuted: se llama a este método después de que se ejecute un resultado de acción de controlador.
Ejemplo implementación
A continuación se muestra un ejemplo sobre como implementar dichos métodos.
Para ello, lo primero que debemos hacer es crear un proyecto de tipo ASP.Net Framework de tipo MVC.
A continuación, creamos una clase que hereda de ActionFilterAttribute. Esta clase debe terminar con “Attribute”.
En mi caso he creado una carpeta Attributes y dentro la clase, con el fin de tener proyecto lo más estructurado posible.
Indicamos que la clase que acabamos de crear hereda de ActionFilterAttribute.
Importante: El using para usar la clase ActionFilterAttribute debe ser System.Web.Mvc.
Una vez herede ya podemos escribir el código: public override void y nos saldrán los cuatro métodos.
Este sería el resultado completo del filtro:
Nota: El método Log, no es propio de la clase ActionFilterAttribute.
Su función es simplemente para el ejemplo que estamos realizando.
Una vez tengamos todos los métodos implementados, necesitamos indicar a que métodos o controladores se va a usar el filtro.
En este caso, hemos implementado el filtro a todo el controlador, podría ponerse solo a ciertos métodos
Nota: A la hora de inyectar el filtro en el controlador o en los métodos, no es necesario escribir “Attribute”. Nuestra clase se llama FiltrosAccionAttribute y sin embargo, solo indicamos FiltrosAccion.
Si ahora lanzamos la aplicación y vamos a los distintos controladores, podremos ver por consola como se muestra los mensajes que hemos indicado en nuestro filtro.
Ejemplo con CORS
Ahora vamos a ver otro ejemplo que nos permite solucionar los problemas de CORS
De forma abreviada, Cors nos permite regular el acceso a los usuarios que llamen a los métodos de nuestro servidor.
https://developer.mozilla.org/es/docs/Web/HTTP/Access_control_CORS
Para este ejemplo vamos a crear de dos proyectos.
- El primero será un Web Api que nos devolverá datos.
- El segundo proyecto será de tipo MVC y será el encargado de llamar al API y mostrar los datos en pantalla.
Proyecto MVC mostrar datos
Para este proyecto vamos a usar el mismo que ya tenemos creado.
Creamos un controlador nuevo y creamos su vista correspondiente con tres botones.
Proyecto Web Api
Vamos a crear un proyecto aparte al que tenemos. El proyecto es un ASP.NET Framework de tipo Web Api. A continuación, vamos a crear un controlador de tipo Api.
En dicho Controlador, creamos una serie de datos de prueba y un par de métodos que nos permitirá recoger dichos datos.
Si arrancamos la aplicación y usamos las urls que están comentadas en el controlador, deberían salir los datos que hemos añadido
Conectando los proyectos
Ahora que ya tenemos los dos proyectos, lo que debemos hacer es volver al Proyecto MVC mostrar datos y mediante Ajax realizar una llamada a nuestro proyecto Api
Ahora arrancamos los 2 proyectos que hemos creado.
Nota: en la url de localhost:Puerto/api/Coches El puerto puede variar. Hay que copiar la ruta del proyecto Api y copiarla.
Si pulsamos sobre cualquiera de los botones y vemos la consola, veremos que nos salta un error de Cors.
Para solucionar este error, debemos añadir un filtro en nuestro controlador CochesController del proyecto Api, para que facilite los permisos.
Por último, indicarle al controlador que use dicho filtro.
Una vez realizado, arrancamos los dos proyectos de forma simultánea y podemos observar como ya no se produce el error de Cors.
Autor: Iván Sánchez Victoria
Curso: Microsoft MCSA Web Applications + Microsoft MCSD App Builder + Xamarin
Centro: Tajamar
Año académico: 2019-2020
Github:
https://github.com/isanchezvictoria/PostISV