Los que me conocéis o habéis ido a alguna de mis charlas sabéis que soy un gran defensor de las técnicas de Caché de salida en las páginas para mejorar el rendimiento y la respuesta de las aplicaciones. De hecho en este blog he hablado ya bastantes veces sobre la Caché en sus diversas variantes. Así que quizá resulte chocante que hoy vaya a hablar sobre justo lo contrario: cómo eliminar la caché de salida (OutputCache) de una página.

Como es sabido, para habilitar la cach√© de salida de una p√°gina o control lo √ļnico que tenemos que hacer es a√Īadir una directiva similar a esta al  principio de la p√°gina, justo tras la directiva de p√°gina:

<%@ OutputCache Duration="60" VaryByParam="None" %>

Los parámetros que se pueden usar son variados y no voy a entrar aquí en detalles pues todo programador de ASP.NET debe conocerlos (si alguien necesita formación sobre desarrollo web, ya sabe ;-)). Es posible hacer caché de la página completa, sólo de algunas partes, de todo menos algunos puntos concretos, que la caché dependa de cualquier parámetro o control, de una variable de QueryString, etc... Incluso definir nuestra propia política de cacheado en función de lo que queramos. En fin, una maravilla, fácil de usar y con resultados espectaculares cuando se aplica juiciosamente.

Pero, como toda herramienta, se puede volver en nuestra contra en un momento dado. ¬ŅQu√© pasa si algo ha cambiado y necesitamos que una determinada p√°gina -cacheada por un buen rato- se actualice inmediatamente con nueva visualizaci√≥n? En este caso necesitaremos que la cach√© de la p√°gina se elimine de inmediato. Es posible crear una dependencia de cach√© para que √©sta dependa de un archivo, una consulta a una base de datos o casi cualquier otro recurso, pero en ocasiones querremos hacer algo m√°s sencillo.

Luego veremos un caso mucho más claro de porqué queremos borrar este tipo de caché, pero primero quiero ver un caso más simple y su solución, más fácil también.

En el caso de simplemente querer eliminar la caché para una página la solución es bastante sencilla, si bien poco conocida por parte de los programadores de ASP.NET. La clase HttpResponse ofrece un método que sirve precisamente para eso: RemoveOutputCacheItem.

El √ļnico par√°metro que necesita este m√©todo es la ruta absoluta virtual (es decir, empezando por "/") de la p√°gina cuya cach√© queremos liberar. As√≠, por ejemlo, para liberar la cach√© de la p√°gina actual har√≠amos lo siguiente:

HttpResponse.RemoveOutputCacheItem(Request.CurrentExecutionFilePath)

Esto en teoría, claro, porque lo primero que hará la mayoría es correar a una página de pruebas, habilitar la caché y poner un botón que haga lo de la línea anterior. El resultado: ¡no le va a funcionar!

El motivo es que, una vez que cacheamos la página completa, al llamarla de nuevo, incluso al pulsar un botón, ésta se saca directamente de la caché y su ciclo de vida normal no se ejecuta, por lo tanto no le funcionarán los eventos. Para conseguirlo con este método es necesario hacer la llamada desde otra página (luego explicaré cómo conseguirlo en la misma página con otro método).

En este archivo (3,95Kb) he incluido una p√°gina que, cuando es accedida desde cualquier otra, invalida la cach√© de √©sta primera (en caso de haberla). As√≠, para eliminar la cach√© de cualquier p√°gina s√≥lo es necesario colocar un enlace a BorraCache.aspx en ella y listo, con este c√≥digo: 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'Obtengo la página desde la que he llegado aquí
        Dim uriAnterior As Uri = Request.UrlReferrer
        If Not uriAnterior Is Nothing Then
            Dim sRuta As String = uriAnterior.AbsolutePath
            HttpResponse.RemoveOutputCacheItem(sRuta)
            lblInfo.Text = "Se ha borrado la caché de la página " + sRuta
        Else
            lblInfo.Text = "Esta página no puede ser llamada directamente. Llámala desde una página cacheada para eliminarla de la caché de salida."
        End If
    End Sub

Obviamente es una prueba de concepto, y en una aplicación real no deberíamos incluirla de esta manera pues podría llamarla cualquiera para eliminar nuestra aplicación, pero sirve para captar la idea y poder usarla, por ejemplo, desde una página de administración protegida.

En el próximo post voy a continuar con este tema y a explicar algo mucho más interesante: Cómo eliminar selectivamente la caché de la página actual.

Imagina esta situación: tienes una página en caché que los usuarios normales pueden ver pero no editar, pero que los administradores puedes cambiar usando los botones apropiados. Si simplemente activas la caché, como hemos visto, ninguno de los eventos normales saltará, así que los administradores tampoco podrán editar nada, ni tampoco se verán los cambios que han hecho hasta que la caché se refresque.

En el próximo post veremos cómo conseguir esto.

💪🏻 ¬ŅEste post te ha ayudado?, ¬Ņhas aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA