Siempre que se habla de la caché suele hacerse refiriéndose a la caché persistente que todos estamos acostumbrados a conocer y usar, bien la caché de salida de las páginas o bien la caché programática usando la clase System.Web.Caching.Cache.

Sin embargo hay ocasiones en las que probablemente nos interesaría más hacer una caché mucho menos persistente. Algo que nos dure lo justo para el propósito de un momento determinado y luego no nos tengamos que preocupar siquiera de deshacernos de ella. En concreto me estoy refiriendo a la caché de contexto o caché de una sola petición.

Imaginemos el caso: en una petición usamos un manejador propio para interceptarla y hacer algo antes de ser procesada la página o bien obtenemos alguna información más o menos costosa durante un evento de global.asax (en BeginRequest o durante la autenticación de la petición). El caso es que esa información la necesitamos usar de nuevo varias veces durante lo que dura la petición actual: en otros módulos o en diversas partes de la página.

Si sólo debemos reutilizar la información en la propia página es muy fácil pues sólo debemos almacenarla en un miembro privado común de la clase que representa a la página y ya está. Pero si tenemos que conservar una serie de valores entre diferentes partes de la misma petición o compartirlos con clases de las que hacemos uso en la página, entonces la cosa no es tan directa.

La pregunta es entonces: ¿qué tenemos en común entre todas las partes (manejadores varios, módulos y nuestra página)? Algo que siempre esté presente... El contexto de la llamada, representado por la clase HttpContext.

A este objeto podemos acceder mediante la propiedad Context de la página actual o, en cualquier lugar del código que esté siendo usado desde una petición HTTP mediante la propiedad Current del propio objeto Httpcontext, así:

HttpContext contexto = HttpContext.Current;

Esta clase tiene una colección de elementos que podemos usar para almacenar con claves los valores que queramos guardar entre partes de esa petición, es decir, mientras dure el contexto. Para ello sólo tenemos que escribir y leer la colección Items que también es la colección por defecto:

HttpContext contexto = HttpContext.Current;
contexto.Items("MiDato") = "lo que sea";
string dato = contexto("MiDato").ToString();

Con esto podemos conservar la información mientras dure la llamada. Cuando ésta termina el objeto HttpContext se destruye (o se marca para que lo recoja el recolector de basura si queremos hablar con propiedad, antes de que "alguien" (y no miro a nadie) me venga a apuntillar) y la información desaparece, pero hemos tenido una caché de información en la que almacenar datos importantes mientras duraba toda la llamada.

En un siguiente post voy a comentar cómo podemos hacer una caché que valga sólo para un usuario y que nos dure automáticamente mientras el usuario esté utilizando la página actual y no otra. Es simple pero muy interesante. Hasta entonces.

Escrito por un humano, no por una IA