lunes, 4 de febrero de 2013

Cache en ASP.NET



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