lunes, 7 de noviembre de 2011

ASP.NET - Almacenamiento en caché (2° parte)


En la entrada anterior estuve escribiendo sobre la cache de aplicaciones (ver entrada anterior). En esta nueva voy a comentar sobre la cache de resultados de páginas.

Cache de resultados de páginas:

Para conocer como funciona el almacenamiento en cache de resultados de páginas veamos que pasa cuando un navegador recupera una página web. Al realizarse esta tarea, se guarda una copia de la página en el equipo local. Al solicitarse la página nuevamente por el usuario simplemente se verifica que la versión guardada en la cache siga siendo válida y luego muestra la página almacenada. Esta acción disminuye el tiempo de carga de la página y reduce cargas innecesarias al servidor.

Ahora, siguiendo con el ejemplo, en el equipo cliente, se genera una página por usuario. Así, si ese usuario visualiza la página 100 veces, la página solo se tiene que generar una vez pero si 100 usuarios visitan una página, el servidor web tendrá que generar esa página 100 veces.

Desde ASP.NET también es posible utilizar la cache de resultados de páginas guardando una copia de una página web ASP.NET renderizada en la memoria del servidor. La próxima vez que un usuario solicite esta, incluso si se trata de otro usuario, ASP.NET puede devolver la página casi al instante.

Al utilizarse este tipo de almacenamiento en cache del lado del servidor, puede mejorar significativamente el rendimiento y aumentar la escalabilidad. Incluso, ASP.NET brinda muchas opciones de configuración a fin de poder satisfacer casi cualquier necesidad.

Configuración de cache para una página:
Es posible configurar cada página ASP.NET en el sitio para ser cacheadas en forma independiente. A su vez también pueden cachearse los controles contenidos en la página. Para poder realizar esto se deberá agregar la directiva @OutputCache en la parte superior del markup la página.

Esta directiva posee los siguientes atributos:
  • Duration: es el tiempo, expresado en segundos, que la página o el control de usuario permanecen en la memoria cache. Este atributo es el único requerido
  • Location: un valor del enumerado OutputCacheLocation. El valor por defecto es Any. Los valores del enumerado son: Any, Client, Downstream, Server, None y ServerAndClient.
  • CacheProfile: nombre de la configuración de cache que se asocia a la página. El valor por defecto es una cadena vacia (“”).
  • NoStore: valor booleano que determina si se debe evitar el almacenamiento secundario de información confidencial
  • ProviderName: cadena que identifica el proveedor de memoria cache de resultados que se va a utilizar.
  • Shared: valor booleano que determina si se puede compartir el resultado del control de usuario con varias páginas. Por defecto el valor es false.
  • SqlDependency: una cadena que identifica un conjunto de pares de bases de datos y tablas de los que depende la memoria cache de resultados de una página o control.
  • VaryByCustom: texto que representa los requisitos personalizados de almacenamiento en la memoria cache de resultados. Si el valor de este atributo es browser, el almacenamiento en caché varía en función del nombre y número de versión principal del browser. En el caso que se escriba una cadena personalizada, será necesario sobreescribir el método GetVaryByCustomString del archivo Global.asax de la aplicación.
  • VaryByHeader: lista de encabezados HTTP, separados por punto y coma, que se utilizan para modificar la memoria caché de resultados. Cuando este atributo se establece en varios encabezados, la memoria caché de resultados contiene una versión diferente del documento solicitado para cada combinación de encabezados especificados.
  • VaryByParam: lista de cadenas, separadas por punto y coma, que se utilizan para modificar el almacenamiento en la memoria caché de resultados. Por defecto, estas cadenas se corresponden con un valor de cadena de consulta enviado con atributos del método GET o con un parámetro enviado mediante el método POST.Cuando este atributo se establece en varios parámetros, la memoria caché de resultados contiene una versión diferente del documento solicitado para cada combinación de parámetros especificados.Los valores posibles incluyen none, un asterisco (* y cualquier cadena de consulta o nombre de parámetro POST válido.
  • VaryByControl: lista de cadenas, separadas por punto y coma, que se utilizan para modificar el almacenamiento en la memoria caché de resultados de un control de usuario. Estas cadenas representan los valores de la propiedad ID de los controles de servidor ASP.NET declarados en el control de usuario.
  • VaryByContentEncondings: lista de cadenas, separadas por punto y coma, que se utilizan para modificar la memoria caché de resultados. Este atributo se utiliza con el encabezado Accept-Encoding para determinar cómo se proporcionan las respuestas almacenadas en caché para las diferentes codificaciones de contenido.

Ejemplo de cómo utilizar estos atributos:
<%@ OutputCache Duration="60" VaryByParam="*" %>

En el ejemplo anterior se le asigno una duración de 60 segundos en la memoria  cache de resultados a la página.

Para más información puede visitar la página de Microsoft: http://msdn.microsoft.com/es-es/library/hdxfb6cy.aspx

Páginas parcialmente cacheadas (Partial-Page Caching)

Algunas veces no es muy práctico almacenar en cache páginas ASP.NET enteras dado que no todas las partes de dicha página cambian en cada solicitud. En estos casos es posible almacenar en cache porciones de páginas. Para hacer esto hay dos formas:
  • control caching
  • post-cache substitution
Control caching: utilizado para almacenar en la cache de resultados partes de una página por medio de la creación de controles de usuario para guardar el contenido a cachear y luego hacer este control de usuario cacheable. Esto permite que cierto contenido sea cacheado en la página mientras que el resto se vuelve a crear cada vez.

Post-cache substitution: es el opuesto a control caching. La página es almacenada en la cache y ciertos fragmentos de esta que son dinámicos es posible marcarlos para no ser cacheados.

lunes, 10 de octubre de 2011

ASP.NET - Almacenamiento en caché

Se encarga de guardar datos de acceso frecuente o de páginas web enteras en la memoria, donde pueden ser recuperados con mayor velocidad. Esto puede ayudar a mejorar el rendimiento de una aplicación web.

Sobre aquellos datos que son de acceso frecuente por varios usuario y además no son modificados muy seguido pueden ser útiles de almacenar en la cache. La primera vez que se acceda en este tipo de página, se guardarán los datos en la cache y las solicitudes siguientes buscarán directamente ahí hasta que la cache expire.

En ASP.NET existen dos tipos diferentes de almacenamiento en Cache:

·         Caché de aplicaciones: Esta representa una colección que puede almacenar cualquier objeto en memoria y automáticamente removerlo en función de las limitaciones de esta, limitaciones de tiempo u otras dependencias.

·         Caché de resultados de páginas: Esta permite el almacenamiento de una página, parte de esta o una versión de la página en la memoria para reducir el tiempo de carga en las próximas peticiones.

Caché de aplicaciones:

En este tipo de almacenamiento en cache no es posible almacenar páginas.
El objeto Cache se encuentra disponible como una propiedad del objeto Page.
La clase Cache implementa el almacenamiento en memoria caché con instancias por aplicación.

La duración de la caché se encuentra asociada al de la aplicación. Si la aplicación se reinicia se vuelve a crear el objeto Cache.

Los ítems de la memoria caché se pueden asignar indicando un nombre (key) y un valor (value). Para recuperar estos ítems se deberá evaluar la existencia del nombre indicado (key) y luego asignar el valor a algún objeto. Si el valor buscado es nulo puede que nunca se haya almacenado o que haya expirado de la caché.

Por ejemplo:

Cache[“test”] = “Almaceno esto en cache”;
If (Cache[“test”]!=null)
   Label1.Text = (string)Cache[“test”];
Else
   Label1.Text = “Se borró”;

La caché permite almacenar cualquier tipo de objeto, incluyendo los tipos de objeto personalizados. Eso si recuerde que al momento de recuperar los valores se deberán convertir al tipo de objeto correcto.

Así como en el ejemplo anterior se almacenó un elemento dentro de la caché asignando un key y value, también es posible realizarlo mediante el método Insert. Este método posee varias sobrecargas que permiten además de agregar los valores anteriores, agregar las dependencias, directivas de expiración, una notificación a la aplicación antes de que se elimine el elemento de la caché y además la prioridad de eliminación del elemento. Vale aclarar que si el elemento a insertar ya existe, el mismo será reemplazado.

Otro método que se puede utilizar para agregar elemento en la caché es el Add, el cual tiene las mismas sobrecargas que el método insert pero en el caso de ejecutarse y un elemento con el mismo nombre ya existe, entonces el método generará un error.

Las sobrecargas de los métodos Insert y Add son las siguientes:

·         Key: (System.String) El nombre del objeto que será utilizado para acceder a los objetos almacenados en la colección de caché.
·         Value: (System.Object) Son los datos de tipo objeto que se quieren guardar.
·         Dependencies: (System.Web.Caching.CacheDependency) Identifica un archivo o un Key con otro elemento de
la memoria caché. En el momento en que el archivo o elemento cacheado cambia, se ejecutará un trigger que dará lugar a que sea removido de la caché.
·         absoluteExpiration: (System.DateTime). Es el tiempo que tiene un objeto para expirar y ser removido de la caché. Si se utiliza slidingExpiration, el parámetro absoluteExpiration debe ser NoAbsoluteExpiration. El tiempo de este parámetro no tiene en cuenta si fue accedido recientemente por un usuario.
·         slidingExpiration: (System.TimeSpan) Es el tiempo que debe transcurrir luego del último acceso al objeto para que expire y sea borrado de la caché. Si se utiliza una absolutExpiration, el parámetro slidingExpiration debe ser NoSlidingExpiration.
·         Priority: (System.Web.Caching.CacheItemPriority) Es un enumerado que se puede utilizar para determinar que objetos se eliminarán primero cuando la memoria caché empieza a agotarse. Cuanta más baja sea la prioridad, más pronto se eliminarán. Los valores de prioridad son los siguientes:
§  Low
§  BelowNormal
§  Normal (por defecto)
§  AboveNormal
§  High
§  NotRemovable
·         onRemoveCallback: (System.Web.Caching.CacheItemRemovedCallback) Es un delegado que se llama cuando se quita un objeto de la memoria caché. Se puede utilizar para enviar notificaciones a aplicaciones cuando algún objeto se elimina de la caché.

En el próximo artículo voy a comentar sobre el tipo de almacenamiento "Caché de resultados de páginas".


Ejemplos (en C#):

Dependencies:

En el siguiente ejemplo se agregan 2 dependencias al objeto de la cache.

System.Web.Caching.CacheDependency dependencia1 = new System.Web.Caching.CacheDependency(Server.MapPath("archivo.txt"));
string[] keyDependencia2 = { "CacheItem1" };
System.Web.Caching.CacheDependency dependencia2 = new System.Web.Caching.CacheDependency(null, keyDependencia2);
System.Web.Caching.AggregateCacheDependency DependenciasAgregadas = new System.Web.Caching.AggregateCacheDependency();
DependenciasAgregadas.Add(dependencia1);
DependenciasAgregadas.Add(dependencia2);
Cache.Insert("ArchivoCache", File.ReadAllText("archivo.txt"), DependenciasAgregadas);


absoluteExpiration:

en el ejemplo se le agregan 30 minutos al objeto para eliminarse:

Cache.Insert("ArchivoCache", "CacheContents", null, DateTime.Now.AddMinutes(30),Cache.NoSlidingExpiration);

slidingExpiration:

en este ejemplo se indican 30 minutos para la eliminación si el objeto no se utiliza:

Cache.Insert("CacheItem", "Item en cache", null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 30, 0)); // horas, minutos, segundos.

priority:

en el ejemplo siguiente se asigna prioridad alta al objeto s:

String s = “Cadena a guardar”; Cache.Insert("Cadena",s, null, DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration, CacheItemPriority.High, onRemove)

viernes, 30 de septiembre de 2011

ASP.NET - abrir página en un frame

Asi como en html es posible hacer un <a href="pagina.htm" target="frame"> , del lado del servidor sobre el código VB o C# podemos utilizar el siguiente llamado para que ejecute del lado del cliente un método de javascript que realice esta tarea. Para esto realizaremos lo siguiente:

 VB
 Response.Write("<script type='text/javascript'>window.open('pagina.aspx','frame')</script>)
C#
 Response.Write("<script type='text/javascript'>window.open('pagina.aspx','frame')</script>);


Es algo muy simple pero que espero a alguno le ayude.

Saludos,

martes, 13 de septiembre de 2011

Conferencias de presentación de Windows 8

El 1 de junio Microsoft mostró detalles de su nueva versión. Es posible seguir desde cerca la evolución de este en el blog de la empresa Building Windows 8.
La versión comercial del producto se estima salga a la venta a medidados del 2012 pero las conferencias de presentación del producto se realizarán durante los próximos 3 días y se estima que serán llevarán a cabo corriendo el sistema desde tablets.

Es probable que salga por la fecha de lanzamiento demorada con la nueva versión de Internet Explorer 10.

Dejo algunos videos sobre esta futura versión. Pueden encontrar más en el blog presentado anteriormente.


Saludos,

domingo, 17 de julio de 2011

Compromiso de vuelta

Bueno, después de varios meses de estar desaparecido entre trabajo, estudio, familia y demás. Teniendo como página de inicio este blog en mis navegadores y sintiendo responsabilidad por no completar nada en meses. Armo esta entrada como compromiso asumido para continuar con este blog. Pensando en dedicale algunas horas semanales para no perder esta herramienta que creo tiene gran valor. Por lo menos para mí.
Sin más y hasta la próxima entrada de esta semana.
Saludos,

viernes, 15 de abril de 2011

Introducción sobre cloud computing.

Si alguna vez escuchaste hablar de cloud computing. Quizas este video te de una mano para entender un poco más. (Inglés)
Cloud Computing and Microsoft® Offerings
Cloud Computing and Microsoft® Offerings
by
Snack Owner


Si no puedes acceder al link, haz click aqui