OutputCache, cache de acciones en ASP.NET MVC

Como vimos en el post anterior “Usar cache para mejorar rendimiento en ASP.NET MVC“, el uso de cache puede ayudarnos a mejorar el rendimiento de nuestras aplicaciones.
Desde el punto de vista del almacenamiento de cache de las páginas de nuestras aplicaciones (y otros tipos de resultados de las acciones de nuestros controladores), la clave está en el uso del atributo OutputCache.

Bajo la utilización del mismo podremos configurar diversos aspectos de cache, tanto a nivel acciones como para todo un controlador (el cache solo aplica a peticiones HTTP GET).

Cache - Atributo OutputCache
Atributo OutputCache

Los valores más comunes que se usan para configurar la cache mediante este atributo son los siguiente (hay varios más que no vamos a ver en este momento):

  • Duration: Como su nombre lo indica, permite establecer la duración en segundos que tendrá el elemento en cache.
  • Location: Permite establecer donde se almacenará la cache. Las alternativas son las siguientes:
    • Any: El resultado podrá ser almacenado tanto en el servidor que generó el resultado, el navegador que solicitó el recurso y cualquier otro intermediario que se encuentre en el medio de la comunicación, como puede ser un servidor proxy.
    • Client: El resultado se almacena solo en el cliente que solicitó el recurso.
    • Downstream: El resultado puede ser almacenado en cualquier dispositivo HTTP 1.1 que participe en la comunicación, excepto el servidor que genera el contenido.
    • None: Permite deshabilitar el cache para dicha acción.
    • Server: Permite almacenar el resultado de la operación en el servidor origen.
    • ServerAndClient: El resultado se almacena tanto en el servidor origen como en el cliente, pero en ningún otro proxy intermedio.
  • VaryByParam: Permite establecer el parámetro de la acción por el cual podrá variar la cache. Si tenemos más de un valor, podremos separa los mismos por “;”. Si queremos usar todos los parámetros, también podemos usar “*” como valor de esta propiedad.

Como podemos ver, tenemos una gran flexibilidad para poder implementar esta mejora en el rendimiento. Imagínense una página con contenido relativamente estático, la cual es requerida por muchos usuarios de forma continua. Aplicando apropiadamente este atributo, podemos reducir la carga asociada a su generación (y obtención necesaria para ello) significativamente.

Sin embargo, algunas veces será necesario deshabilitar la cache para determinadas acciones (generalmente cuando se hace una llamada Ajax ciertos navegadores por defecto almacenan el resultado en cache, pudiendo producir un efecto no esperado en nuestras aplicaciones). Utilizando el mismo atributo, podremos deshabilitar la cache de la siguiente forma:

Cache - DeshabilitarCache
Deshabilitar cache en una acción

Ahora bien, supongamos que empezamos a utilizar esta funcionalidad en nuestra aplicación. Cuando nos demos cuenta, muchas veces estaremos repitiendo los mismos valores para lograr un comportamiento uniforme, como puede ser el ejemplo anterior de deshabilitar la cache en varias acciones de nuestra aplicación. Para ello nuevamente ASP.NET MVC cuenta con la flexibilidad necesaria para evitarnos repetir estos valores por toda la aplicación, lo cual luego dificultará enormemente el mantenimiento. Lo que debemos hacer es crear los denominados “CacheProfiles“, los cuales son entradas agregadas al Web.Config, bajo la sección system.web:

Cache - CacheProfileWebConfig
Agregar los CacheProfile en el Web.Config

Usarlos es muy sencillo. En el atributo OutputCache debemos setear la propiedad CacheProfile con el nombre que pusimos en el Web.Config. Por ejemplo, para la acción Index usamos el perfil FiveMinutesCache, mientras que About no deberá usar cache:

Cache - UsoCacheProfiles
Uso de CacheProfiles en el atributo OutputCache

Ejecutemos la aplicación con esta configuración de cache. En la imagen a continuación se muestra la consola de red luego de realizar por segunda vez una petición sobre cada una de las páginas representadas por las acciones de la imagen anterior:

Cache - ResultadosOutputCache
Resultados de ejecución de distintas configuraciones de cache

A su vez, si sobre la página Index limpiamos la cache del navegador y ponemos un punto de interrupción en la acción correspondiente, veremos que tampoco accederá hasta que se cumplan los 5 minutos desde el primer acceso – créanme que realmente sucede esto mientras esto escribiendo este post -. Esto implica un potencial de mejora en el rendimiento muy amplio, aunque hay que tener la consideración de que si se produce algún cambio en los datos utilizados para renderizar esta página el mismo no será visible por los usuarios hasta que la página en cache tanto en el cliente como en el servidor expiren.

Incluso, si estamos en búsqueda de la mantenibilidad, podemos ir un paso más y agregar una clase con los nombres de los CacheProfiles como constantes. De esta forma evitamos que se escriba mal el nombre, y nos hace mucho más sencillo acciones posteriores, como reemplazar un perfil:

Cache - ClaseParaProfiles
Clase con los nombres de los CacheProfiles
Cache - UsoClaseProfiles
Uso de la clase creada para los CacheProfiles

A su vez, si lo deseamos podemos aplicar el atributo OutputCache a nivel controlador, de forma que aplique para todas las acciones HTTP GET que contenga (recordemos que el almacenamiento en cache solo aplica a peticiones GET).

Como siempre en lo relacionado a cache, debemos ser cuidadosos en donde aplicarlo y tener en cuenta el impacto potencial que una incorrecta utilización del mismo puede llegar a generar en el uso de la aplicación – tampoco los quiero asustar 😉 -. Igualmente, en casi todas las aplicaciones que desarrollemos podremos darle un uso a este atributo, el cual nos ayudará tanto a mejorar el rendimiento como a forzar el no almacenamiento de la cache en el navegador en ciertas acciones.

Para esos casos en los que lo necesiten espero que este post les sirva como guía y comprendan como configurar cada caso según su necesidad.

Gracias por leer!!

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s