En este blog y en otros ámbitos (charlas, libros, artículos...) he hablado muchas veces sobre la caché en ASP.NET. Usar la caché en todas sus variantes es un método fundamental para obtener alto rendimiento en nuestras aplicaciones web, aunque sorprende ver cuántas aplicaciones Web hay por ahí que no le sacan partido en absoluto. Así que debemos aplicarla cuando sea pertinente. Eso sí, hay que hacerlo con cuidado y pensando bien cómo lo vamos a hacer, pues puede darnos más problemas de los que nos soluciona.
Hoy voy a hablar de una característica nueva que apareció en ASP.NET 2.0 y que no usa demasiada gente. Y es que realmente de lo que voy a hablar es más bien de una anti-caché :-)
Se trata de dela sustitución post-caché. Ésta trabaja justo al contrario que una caché de salida normal. Es decir, en lugar de hacer caché de una parte de la página, deja que ésta se actualice, manteniendo todo lo demás. Se entiende mucho mejor con un ejemplo.
Imaginemos una página grande, con diversas zonas, que apenas cambia excepto por una o dos pequeñas zonas. Es decir, entre petición y petición a la página prácticamente todo es igual siempre menos algún dato o algún texto determinados. El caso típico es que debamos actualizar la fecha y hora actuales o el número de registros que hay en una base de datos. ¿Cómo haríamos caché de una página como ésta?.
En ASP.NET 1.x no nos quedaría más remedio que descomponer las partes de la página en varios controles de usuario. De este modo componemos la página a partir de los controles, y en lugar de hacer caché de la página, haríamos caché de los controles de usuario (que ya sabéis que soportan también las directivas OutputCache para hacer caché de salida. Debe de haber un montón de páginas por ahí hechas de esta forma.
En ASP.NET 2.0 tenemos una opción mucho más práctica. Se trata del control Substitution. Lo podemos encontrar al final de los controles estándar de la barra de controles, listo para ser arrastrado a la página.
Este control lo colocaríamos en la zona de nuestra página que queremos que no se mantenga dentro de la caché, es decir, que debe variar en cada petición.
Dispone de una propiedad que se llama MethodName y que, como su propio nombre deja entrever, permite especificar el nombre de un método estático (Shared en VB) de la página, que se llamará durante el renderizado del control para obtener el texto o el HTML que queremos que aparezca en su ubicación al visualizar la página. De este modo devolvemos lo que necesitemos en cada caso olvidándonos de la caché que esta afectando al resto de la página.
El método estático se puede llamar como queramos (claro), pero debe tener la firma siguiente:
public static string MiAntiCache(HttpContext contexto)
{
}
Es decir, devuelve una cadena y toma comop parámetro el contexto actual de la llamada a la página, de forma que podamos usarlo para acceder a toda la información sobre ésta (como la sesión o las variables de contexto, por ejemplo).
¡Listo! con esto conseguiremos hacer caché de todo menos de trocitos de la página, lo que en ciertos casos nos va a resultar muy útil.