En ASP.NET existen 2 diferentes formas de trabajar el cache:
·
Cache en Paginas y Controles de Usuario por
Directiva OUTPUT CACHE
·
Cache en DATA
Declarando salda de
Cache en Paginas
Definiendo en la directiva la siguiente declaración:
<%@ OutputCache Duration="10" VaryByParam="None" %>
Donde la duración estará dada en segundos o bien cuando cambie algún parámetro en este
caso deshabilitado.
VaryByHeader="Referer"
Podemos utilizar VaryByHeader para que se modificado el cache basado en los
HTTP Headers a los cuales tendremos acceso por medio de Request.Headers el cual nos
regresara una colección de registro y podremos recorerlo por medio de un
For. La propiedad “Referer” hace
referencia a la página que la solicitó, de modo que tendremos un cache por cada
sitio que lo haya pedido.
Codigo para cargar los HTTP header y agregarlos a una tabla
Dim dt As New DataTable
Dim row As DataRow
Dim i As Integer
dt.Columns.Add("Header")
dt.Columns.Add("Valor")
With Request.Headers
For i = 0 To .Count - 1
row =
dt.NewRow
row(0) =
.GetKey(i)
row(1) =
.Item(i)
dt.Rows.Add(row)
Next
End With
grdHeaders.DataSource
= dt
grdHeaders.DataBind()
VaryByCustom="Browser"
Por medio del browser que solicito tendremos un versión de página
por cada browser que solicite.
"Browser: " &
Request.Browser.Type
Uso del Control
Substitution
El Control Substitution
ejecuta una función dentro de nuestro código que deseemos que siempre se
genere nuevamente y no quede registrada
en cache. Es la excepción en la página
almacenada en cache.
<asp:Substitution ID="Substitution1" runat="server" MethodName="TiempoActual" />
La función deberá ser Protected
Shared a como e muestra en el
ejemplo siguiente:
Protected Shared Function TiempoActual(ByVal context As HttpContext) As String
Return DateTime.Now.ToString("HH:mm:ss")
End Function
public static string MiAntiCache(HttpContext contexto)
{
}
Configuracion general
del OutputCache
Dentro del web.config podemos configurar un profile para el
cache definiendo el tiempo, o bien el mecanismo de variación del cache y será utilizado
en las diferentes directivas de cada página.
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="TiempoCorto" duration="30" varyByParam="none"/>
</outputCacheProfiles>
</outputCacheSettings>
<outputCache enableOutputCache="true"/>
</caching>
Dentro del formulario web aspx especificaremos el nombre del
profile de esta manera:
<%@ OutputCache CacheProfile="TiempoCorto"
Cache en Data
Cache simple:
Podemos utilizar la cache de manera similar a si usáramos
una variable de session, simplemente verificamos si existe el elemento, en caso
de existir lo usamos de lo contrario vamos a la base de datos y luego cacheamos
el elemento. La desventaja de este método es que una vez cacheado el elemento,
no es posible determinar si nuestro origen de datos ha cambiado, lo cual podria
generar datos inconsistente. El código siguiente muestra la implementación de
este caso:
If Cache("cache1") Is Nothing Then
dt =
oConexion.GetUsers()
Cache("cache1") = dt
grvUsuarios.DataSource
= dt
grvUsuarios.DataBind()
Response.Write("Cache created at: " & Now)
Else
dt = CType(Cache("cache1"),
DataTable)
grvUsuarios.DataSource
= dt
grvUsuarios.DataBind()
Response.Write("Cache used at: " & Now)
End If
Lo primero es verificar si el objeto existe en la cache, si
no existe entonces obtenemos los datos de la base de datos con la función
GetUsers() y luego cacheamos el elemento, así en una segunda oportunidad como
ya se encuentra el objeto en la cache no se realiza de nuevo la consulta a la
base de datos.
Cache con tiempo de expiración:
Al igual que con el caso anterior, para acceder a la cache
lo hacemos de manera similar a como se accede a una variable de session, la
diferencia radica en que cuando creamos el objeto en la cache le definimos un
tiempo de vida, así cuando dicho tiempo se cumpla el objeto cacheado “muere” y tendríamos
que volver a cachearlo; de esta manera estaríamos refrescando regularmente
nuestros objetos cacheados para tener siempre los datos reales de la base de
datos, sin embargo se puede dar el caso q los datos puedan ser cambiados y que
le tiempo de cache no se haya cumplido, pero ya veremos en el siguiente caso
como podemos solucionar este caso.
Dim Expires As DateTime
Expires =
DateAdd(DateInterval.Second, 10, Now)
If Cache("cache2") Is Nothing Then
dt =
oConexion.GetUsers()
Cache.Insert("cache2",
dt,
Nothing,
Expires,
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Default,
Nothing)
grvUsuarios.DataSource
= dt
grvUsuarios.DataBind()
Response.Write("Cache created at: " & Now)
Else
dt = CType(Cache("cache2"),
DataTable)
grvUsuarios.DataSource
= dt
grvUsuarios.DataBind()
Response.Write("Cache used at: " & Now)
End If
A recordar
Utilice las clases cache para
implementa caché de una aplicación web y añade el objeto Cache.
La directiva @OutputCache controla
las políticas de caché de salida de una página ASP.NET o un control de usuario
que figura en una página ASP.NET.
El atributo Duration de
la directiva @OutputCache
especifica la cantidad de tiempo (en segundos) para los que se almacena en
caché en un control. El atributo VaryByParam
permite a los desarrolladores a variar los resultados de caché en función de
una cadena de consulta GET o los parámetros POST de un formulario.
No hay comentarios:
Publicar un comentario