Almacenar en caché partes de una página ASP.NET
A veces no resulta práctico almacenar en memoria caché una página completa porque las partes de la página puede que tengan que cambiar en cada solicitud. En esos casos, puede almacenar en memoria caché sólo una parte de una página. Hay dos opciones para ello: almacenamiento en caché de controles y substitución de la post-caché.
El almacenamiento de controles en caché, también denominado almacenamiento de fragmentos en caché, permite almacenar en memoria caché partes del resultado de la página, creando controles de usuario que incluirán el contenido almacenado en caché y, a continuación, marcando los controles de usuario como almacenables en caché. Esto permite almacenar en memoria caché contenido específico dentro de una página, mientras que la página total se vuelve a crear cada vez. Por ejemplo, si crea una página que muestra principalmente contenido dinámico, como información bursátil, pero también contiene secciones que son estáticas, como resúmenes semanales, puede crear las secciones estáticas en controles de usuario y configurarlos para que se almacenen en memoria caché.
La sustitución posterior al almacenamiento en caché es lo contrario. La página se almacena en memoria caché, pero los fragmentos incluidos en ella son dinámicos y, por consiguiente, no se deben almacenar en memoria caché. Por ejemplo, si crea una página que es completamente estática para períodos de tiempo fijos, como una página de reportajes periodísticos, puede establecer que se almacene en memoria caché la página completa. Si agregó titulares publicitarios giratorios a la página almacenada en memoria caché, éstos no cambiarán entre las solicitudes de la página. Sin embargo, con la substitución de la post-caché, la página se puede almacenar en memoria caché, pero puede marcar partes específicas como no almacenables en caché. En el ejemplo, marcaría sus titulares publicitarios como no almacenables en caché. A continuación, se crearían dinámicamente para cada solicitud de página y se agregarían al resultado de la página almacenada en memoria caché. Para obtener más información sobre substitución de la post-caché, vea Actualización dinámica de fragmentos de una página almacenada en memoria caché.
Almacenamiento en caché de controles
La creación de controles de usuario para almacenar en memoria caché el contenido permite separar del resto de la página las partes cuya creación consume más tiempo de procesador, por ejemplo, las consultas de bases de datos. Las partes de la página que requieren menos recursos del servidor se pueden generar dinámicamente para cada solicitud.
Una vez identificadas las partes de la página que desea almacenar en caché y creados los controles de usuario que las contienen, deberá determinar las directivas de almacenamiento en caché de los controles de usuario. Puede establecer estas directivas mediante la declaración de la directiva @ OutputCache o utilizando la clase PartialCachingAttribute en el código del control de usuario.
Por ejemplo, si se incluye la directiva siguiente al principio de un archivo de control de usuario (.ascx file), se almacenará una versión del control en la caché de resultados durante 120 segundos.
<%@ OutputCache Duration="120" VaryByParam="None" %>
Si desea establecer los parámetros de almacenamiento en caché en el código, puede utilizar un atributo en la declaración de clase del control de usuario. Por ejemplo, si incluye el siguiente atributo en los metadatos de la declaración de clase, se almacenará una versión del contenido en la caché de resultados durante 120 segundos:
[PartialCaching(120)]
public partial class CachedControl : System.Web.UI.UserControl
{
// Class Code
}
<PartialCaching(120)> _
Partial Class CachedControl
Inherits System.Web.UI.UserControl
' Class Code
End Class
Para obtener más información sobre los atributos que puede establecer en el resultado de la página, consulte el tema @ OutputCache. Para obtener más información sobre cómo desarrollar controles de usuario, vea Información general sobre los controles de servidor Web ASP.NET.
Nota
Dado que puede anidar controles de usuario en una página, también puede anidar controles de usuario colocados en la caché de resultados. Puede especificar una configuración de la caché diferente para la página y para los controles de usuario anidados.
Hacer referencia a controles de usuario almacenados en memoria caché mediante programación
Al crear un control de usuario almacenable en caché de forma declarativa, puede incluir un atributo ID para hacer referencia a dicha instancia del control de usuario mediante programación. Sin embargo, antes de hacer referencia al control de usuario en el código, deberá comprobar la existencia del control de usuario en la caché de resultados. Los controles de usuario que se almacenan en caché sólo se generan dinámicamente en la primera solicitud; las siguientes solicitudes se atienden desde la caché de resultados hasta que se agota el tiempo especificado. Una vez que se determina que se ha creado una instancia del control de usuario, éste se puede manipular mediante programación desde la página que lo contiene. Por ejemplo, si asigna mediante declaración el valor SampleUserControl
a la propiedad ID para un control de usuario, puede comprobar su existencia con el código siguiente:
protected void Page_Load(object sender, EventArgs e)
{
if (SampleUserControl != null)
// Place code manipulating SampleUserControl here.
}
Protected Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
If SampleUserControl <> Nothing Then
' Place code manipulating SampleUserControl here.
End If
End Sub
Almacenar en memoria caché la página y los controles de usuario para duraciones diferentes
Puede establecer unos valores de duración de la caché de resultados diferentes para una página y para los controles de usuario de dicha página. Si la duración de la caché de resultados de la página es más larga que la duración de la caché de resultados del control de usuario, la duración de la caché de resultados de la página tendrá prioridad. Por ejemplo, si el almacenamiento de los resultados de la página en caché se establece en 100 segundos y el de los resultados del control de usuario en 50 segundos, la página completa, incluido el control de usuario, se almacenará en la caché de resultados durante 100 segundos, sin tener en cuenta el valor menor establecido para el control de usuario.
En el siguiente ejemplo de código se muestra el efecto de una duración del almacenamiento en caché más larga en la página que en un control de usuario. La página está configurada para que se almacene en memoria caché durante 100 segundos.
<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>
<SampleControl:Time runat="server" /><br /> <br /> <br />
This page was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>
<%@ Page language="VB" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>
<SampleControl:Time runat="server" /><br /> <br /> <br />
This page was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>
En el ejemplo de código siguiente se muestra el control de usuario incluido en la página. La duración del almacenamiento en caché del control está establecida en 50 segundos.
<% @Control language="C#" %>
<% @OutputCache duration="50" varybyparam="none" %>
This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>
<% @Control language="VB" %>
<% @OutputCache duration="50" varybyparam="none" %>
This user control was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>
Si la duración del almacenamiento en la caché de resultados de la página es menor que la de un control de usuario, éste se almacenará en memoria caché hasta que transcurra su duración, incluso después de que se regenere el resto de la página para una solicitud. Por ejemplo, si el almacenamiento en la caché de resultados de una página se establece en 50 segundos, y el del control de usuario en 100 segundos, el control de usuario caducará una vez por cada dos veces que lo haga el resto de la página.
El código siguiente muestra el marcado de una página que contiene el control de usuario con una duración del almacenamiento en caché más larga que la de la página. La página está configurada para que se almacene en memoria caché durante 50 segundos.
<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>
<SampleControl:Time runat="server" /><br /> <br /> <br />
This page was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>
<%@ Page language="VB" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="Uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>
<SampleControl:Time runat="server" /><br /> <br /> <br />
This page was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>
El código siguiente muestra el control de usuario incluido en la página. La duración del almacenamiento en caché del control está establecida en 100 segundos.
<% @Control language="C#" %>
<% @OutputCache duration="100" varybyparam="none" %>
This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>
<% @Control language="VB" %>
<% @OutputCache duration="100" varybyparam="none" %>
This user control was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>
Vea también
Conceptos
Información general sobre el almacenamiento en caché en ASP.NET
Actualización dinámica de fragmentos de una página almacenada en memoria caché
Almacenar en memoria caché varias versiones de una página
Almacenar en caché datos de la aplicación
Lo nuevo en almacenamiento en caché de ASP.NET
Configuración de la caché en ASP.NET