Tutorial de ASP.NET
Vista Previa de ASP.NET 2.0

Cacheado de la página de salida

El cacheado de salida es una potente técnica que incrementa la respuesta de las peticiones y respuestas metiendo en la caché el contenido generado por páginas dinámicas. El cacheado de salida está habilitado por defecto, pero el resultado de una respuesta determinada no se cachea a menos que se especifique esa respuesta como cacheable.

Para hacer que sea posible cachear una respuesta, debe tener una política válida de caducidad o validación y visibilidad pública de su caché. Podemos hacer esto o bien usando la API de bajo nivel OutputCache o la directiva de alto nivel @OutputCache. Cuando se habilita el caché de salida, se crea una entrada de caché de salida en la primera petición GET a la página. Todas las peticiones GET o HEAD posteriores se sirven desde la caché de salida hasta que la petición cacheada caduca. La caché de salida también permite variaciones de pares nombre/valor GET o POST cacheados.

La caché de salida respeta las políticas de caducidad y validación de las páginas. Si una página está en el caché de salida y ha sido marcado con una política de caducidad que indica que la pagina caduca a los 60 minutos de haber sido cacheada, se quita a la página del caché de salida a los 60 minutos. Si se recibe otra petición después de ese intervalo, el código de la página se ejecuta y la página puede ser cacheada de nuevo. Se llama caducidad absoluta a este tipo de política de caducidad - una página es válida durante cierto tiempo.

La Directiva de caché de salida

El siguiente ejemplo demuestra una forma simple de cachear respuestas de salida mediante la directiva @OutputCache. Este ejemplo simplemente muestra la hora a la que se generó la respuesta. Para ver el cacheado de salida en acción, cargad la página y observa la hora a la que se generó la respuesta. Entonces refrescad la página y observad que la hora no ha cambiado, lo que indica que se está sirviendo la segunda respuesta desde el caché de salida.

Caché de salida en C#

La siguiente directiva activa el caché de salida en la respuesta:

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

Esta directiva indica sencillamente que la página debe cachearse durante 60 segundos y que la página no variará por ningún parámetro GET o POST. Las peticiones que se reciban mientras la página esté en la caché serán respondidas desde la caché. Después de 60 segundos, se quita a la página de la caché; se maneja la siguiente petición de forma explícita y se vuelve a cachear la página.

Por supuesto, en el ejemplo anterior se ahorra muy poco trabajo mediante el cacheado de salida. El siguiente ejemplo demuestra la misma técnica de cacheado de salida, pero realizando una llamada a una base de datos y mostrando los resultados en una tabla.

Caché de salida en C# 2

Cambiar mediante parámetros

En este ejemplo modificamos ligeramente la aplicación para permitir al usuario que busque de forma selectiva autores en varios estados. El ejemplo muestra el cacheado de peticiones que cambien los pares nombre/valor de la cadena de consulta usando el atributo VaryByParam de la directiva OutputCache.

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

Por cada estado en el conjunto de datos, hay un vínculo que pasa el estado deseado como parte de la cadena de consulta. Entonces la aplicación construye la consulta apropiada a la base de datos y muestra sólo aquellos autores que pertenezcan al estado seleccionado.

Observa que la primera vez que hacemos clic en el vínculo de un estado determinado se genera una nueva etiqueta de fecha en la parte inferior de la página. A partir de ahí, cada vez que se vuelva a introducir una búsqueda por ese estado en el espacio de un minuto, la etiqueta muestra la fecha y hora a la que se cacheó la petición original.

Cacheado de salida VaryByParam en C#



Notificación de Caché SQL nuevo en 2.0

En el ejemplo anterior los datos se cacheaban durante 60 segundos, sin importar si los datos habían cambiado en la base de datos. La invalidación de caché SQL te permite hacer que la caché de entrada dependa de la base de datos, de tal manera que el caché de entrada solamente se limpiará cuando los datos en la base de datos hayan cambiado. Para más detalles, ver la página Notificación de Caché SQL.


Sustitución post-caché nuevo en 2.0

En ASP.NET 1.0, las páginas que eran estáticas en su mayor parte pero que contenían una pequeña región dinámica, como el nombre de usuario o la hora actual, eran forzadas con frecuencia a no usar cacheado o a dividir la página en múltiples controles de usuario cacheados con caché de fragmentos. ASP.NET 2.0 permite que estas páginas se aprovechen del cacheado de salida, permitiendo que las páginas de salida cacheadas puedan insertar nuevo contenido dinámico en cada solicitud.

En el siguiente ejemplo, la página con salida cacheada inserta una llamada dinámica a un método estático que devuelve la fecha actual mediante la API Response.WriteSubstitution. Esta llamada dinámica se ejecuta en cada solicitud, y el resultado se inserta en la cadena de caché de respuesta que se sirve desde el caché de salida.

Sustitución Post-caché, C#

El siguiente ejemplo realiza la misma acción que el anterior, pero usa un control asp:Substitution para insertar el contenido dinámico.

Control de Sustitución en C#


Usando el API de Caché

Aquellas aplicaciones que necesiten más control sobre los encabezados HTTP relacionados con el caché pueden usar la funcionalidad proporcionada por la clase System.Web.HttpCachePolicy. El siguiente ejemplo muestra el código equivalente a las directivas de página de ejemplos anteriores:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);

C#

Podemos convertirla en una política de caducidad deslizante, haciendo que la hora de caducidad se vuelva a establecer cada vez que se hace una petición a la página, estableciendo la propiedad SlidingExpiration como en el siguiente ejemplo.

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetSlidingExpiration(true);
C#

Nota: Cuando se habilita la caducidad deslizante (SetSlidingExpiration(true) ), cada petición hecha al servidor de origen siempre genera una respuesta. La caché deslizante es útil en escenarios donde existen cachés hacia el cliente que pueden satisfacer peticiones de cliente, si el contenido no ha caducado aún, sin solicitar el contenido del servidor de origen.