14 nov 2011

Usando Master Pages, Themes y Caching (Parte Practica II)

Hola buen día a todos

Hoy les traigo la continuación de la anterior entrega respecto al cache que era el que nos hacia falta (Disculpen por no hacerlo la semana pasada eh estado muy full...).


En resumen a la teoría la memoria cache sirve para almacenar en memoria algunos objetos de la pagina o toda la pagina si lo desean en la memoria del servidor (o la del navegador del cliente) de manera que el navegador no tenga que descargar siempre el contenido de la pagina si no lo obtiene todo directamente desde la memoria cache.


Nota: La memoria cache del navegador es case-sensitiveesto puede resultar en el navegador la descarga del mismo objeto más de una vez si yo no uso consistentes casos para las direcciones URL que se refieren al mismo objeto. Por ejemplo no seria lo mismo en la memoria cache la descarga del objeto <img src="myimage.jpg" width="50" height="50" /> <img src="myimage.JPG" width="50" height="50" /> como verán son la misma imagen pero la extensión termina en mayúscula ya con este ligero cambio lo considera como otro objeto.


Para poder empezar a usar el cache tenemos que agregar una nueva directiva de pagina llamada OutputCache (  <%@ OutputCache Duration="60" VaryByParam="None"%> ) este es el tipo de cache que se usa para la pagina completa y lo ponemos en las paginas que queramos que tengan cache y si queremos un punto central en donde modificarlo por ejemplo el tiempo lo podemos hacer en el web.config dentro de <system.web>:



<caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name="Cache60sgd" duration="60"
            varyByParam="none" />
        </outputCacheProfiles>
      </outputCacheSettings>
</caching>



y se pondría en la directiva de pagina CacheProfile ( <%@ OutputCache CacheProfile="Cache60sgd"%> ) 






Cabe mencionar que no solo se usa para el OutputCache la propiedad varyByParam tambien esta:
Ahora un ejemplo de como carga la pagina sin cache





y con cache





como podrán notar la imagen dentro del documento no se cacheo esto pasa en firefox y en google chrome pero en internet explore ( por lo menos la versión 9 que fue donde probé) si se cachea el documento completa mente cuando hace el request hace solo una petición al cache que se trae todo el documento completo.


Estas pruebas se hicieron fue como localhost pero según con IIS todo se almacena automáticamente como podrán ver en este articulo que encontré en la web: http://technet.microsoft.com/es-es/library/dd239248(v=ws.10).aspx


Ahora también esta el objeto como tal Cache que a diferencia del Output guarda son resultados de objetos por ejemplo: Estamos programando una aplicación para una universidad que se trae todos los profesores de la base de datos y los guarda en un dataset este lo podemos guardar en el objeto cache de modo que no tenga que ir todo el tiempo a la base de datos y traerse todos los profesores si no que lo obtiene directo de memoria.


Se puede usar asi: Cache["key"] = "value";


o asi: 

Cache.Insert("key", myXMLFileData, new 
  System.Web.Caching.CacheDependency(Server.MapPath("users.xml"))); 
En este caso cambia cuando el archivo users.xml cambia
Cache.Insert("key", myTimeSensitiveData, null, 
  DateTime.Now.AddMinutes(1), TimeSpan.Zero);
En este otro caso se le estableció un tiempo de duración al cache 
Para mas información respecto a las sobrecargas y los parámetros la pueden conseguir aquí: 
http://msdn.microsoft.com/es-es/library/system.web.caching.cache.insert.aspx
Y para el caso que mencione en el ejemplo seria mas o menos así:
public DataTable GetTeachers(bool BypassCache)
{
   string cacheKey = "TeachersDataTable";
   object cacheItem = Cache[cacheKey] as DataTable;
   if((BypassCache) || (cacheItem == null))
   {
      cacheItem = GetTeachersFromDataSource();
      Cache.Insert(cacheKey, cacheItem, null,
      DateTime.Now.AddSeconds(GetCacheSecondsFromConfig(cacheKey), 
      TimeSpan.Zero);
   }
   return (DataTable)cacheItem;
}
Bueno esto es todo por hoy asta el siguiente post... (Esperemos que sea pronto jeje...)

No hay comentarios:

Publicar un comentario