Firmas invitadas
 

Mejorando el rendimiento en ASP.NET con la directiva OutputCache

Publicado el 06/Nov/2006
Actualizado el 12/Nov/2006

Autor: Sergio Vázquez
 

Mediante este artículo aprenderemos a incrementar el número de páginas servidas por segundo de los apartados mas accedidos de nuestro sitio web en ASP.NET.

 

 

Mi amigo el Guille, en el Code Camp 2006 de Madrid me propuso dedicarle un artículo por su aniversario y aquí estamos J colaborando con la comunidad otra vez.

 

Voy a escribir sobre algo que puede incrementar el rendimiento de vuestro sitio web si recibís muchas visitas, la Cache de Salida en ASP.NET con la que se pueden resolver problemas de rendimiento como me ha pasado con determinados clientes. Esto es válido tanto para ASP.NET 1.x como ASP.NET 2.0

 

Introducción

ASP.Net proporciona cacheo dinámico de salida, que nos permite almacenar formularios web enteros y controles de usuario en memoria. Después de la primera petición http en la que se compila la página, el formulario, control o servicio web no se ejecuta, se usa el outputcache para resolver la petición sin pasar de nuevo por el analizador sintáctico (parser), compilador ni el caché de ensamblados.

 

 

Existe un único caché de salida por cada servidor web y las páginas y fragmentos de página no puede ser accedidos por otros servidores en un Web Farm o granja de servidores.

 

Parámetros

La directiva caché en ASP.NET tiene los dos siguientes parámetros obligatorios que se pueden poner debajo de la directiva Page de la página .aspx. Se hace de forma declarativa de la siguiente forma:
 

 

<%@Outputcache VaryByParam="None" Duration="3" %>

 

O bien por programación:

 

 Response.Cache.SetExpires(DateTime.Now.AddSeconds(3))

 

Con varbyparam le indicamos si algún parámetro de la página se va a cachear y con duration le indicamos en numero  de segundos que queremos que guarde en caché nuestra página hasta que se vuelva a cargar de su sitio original. Debemos buscar un equilibrio según el número de hits de nuestra página.

 

Si vemos el fuente de nuestra página podemos ver esto después de agregar una página en Visual Studio Web Developer Express y poner la directiva caché:
 

 

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<%@Outputcache VaryByParam="none" Duration="10" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>Prueba de Cache</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        Prueba de cache de 10 segundos de página para ElGuille<br />

        <br />

    Son las

        <asp:Label ID="Label1" runat="server"></asp:Label></div>

    </form>

</body>

</html>

 

 

En el código fuente añadimos al Page_load el siguiente código:
 

 

Partial Class _Default

    Inherits System.Web.UI.Page

 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Label1.Text = DateTime.Now.ToString

    End Sub

End Class

 

Ejemplo 1

Supongamos que tenemos una página con esta directiva. El resultado de hacer clic durante los tres primeros segundos se puede ver en la figura. Esto nos puede servir por ejemplo para cuando tenemos una web con las noticias del día en la portada que no se actualizan en mas de 10 segundos por ejemplo.

 

 

Utilizando este tipo de caché también podemos mantener páginas en caché usando variables del querystring como por ejemplo idnoticia de la siguiente manera:
 

<%@Outputcache VaryByParam="idnoticia" Duration="10" %>

 

O bien por navegador usando el parámetro VarByCustom de la directiva OutputCache

 

¿Y si hay una parte de la página que cambia a menudo?

Tranquilos, También hay solución para esto, podemos usar el control asp:substitution para la parte que no queremos que quede en caché de la siguiente manera:

 

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="cache2.aspx.vb" Inherits="cache2" %>

<%@Outputcache    VaryByParam="none" Duration="10" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>Prueba de cacheo parcial</title>

</head>

<body>

<script runat="server">

  

 

    Public Shared Function dimehora(ByVal context As HttpContext) _

            As String

        Return DateTime.Now.ToString()

    End Function

</script>

    <form id="form1" runat="server">

    <div>

    Esta parte de la pagina se cachea sin problema <%=DateTime.Now.ToString%>

    </div>

    <p>

    a partir de aqui no se cachea

    <asp:Substitution ID="hora" runat="server" MethodName="dimehora" />  

    </p>

    <asp:Button runat="server" ID="Button1" Text="Submit"/>

    </form>

</body>

</html>

 

El resultado que os debe salir en pantalla es este:

 

 

O bien usar un control de usuario y cachear solo el control de usuario .ascx por ejemplo la cabecera o pie de nuestro sitio web que siempre se repite y no suele cambiar a menudo.

 

NOTA IMPORTANTE:
Crear un caché de salida debe ser el último paso después de probar y compilar tu página web porque sino cuando depuras puedes ver páginas desactualizadas que están almacenadas en la caché en vez de conseguir las páginas .aspx que acabas de modificar nuevas.

 

Herramientas para medir el rendimiento de la caché

Podéis encontrar información y descargar la herramienta gratuita WAS para medir el rendimiento de vuestra web en picos de carga con muchos usuarios Forma parte del kit de recursos de IIS 6.0  y se puede ver desde  aquí:
 

http://www.microsoft.com/technet/archive/itsolutions/intranet/downloads/webstres.mspx?mfr=true


http://support.microsoft.com/kb/231282

 

También nos servirá para probar los bloqueos y otros problemas de escalabilidad de los componentes del servidor.

 

Conclusiones

Con la caché de salida de ASP.NET si sabemos manejarla adecuadamente podemos conseguir un mayor numero de páginas servidas por segundo. Esto es independiente del cacheo o compresión de archivos vía HTTP que podemos activar en IIS 6.0  o el caché de datos en SQL Server y que no entra en este artículo.

 

Espero que os sea esto útil para la portada de vuestra web o los apartados más accedidos de la misma.

 

Podéis encontrar información mas detallada en la MSDN

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconoutputcache.asp

 

Nos vemos.

 

Sergio Vázquez Martín

Ingeniero Informático-MCP- Consultor e Instructor .NET

http://geeks.ms/blogs/sergio

http://www.mutisdotnet.com

"El sabio escucha, el inteligente discute y el ignorante grita" by Séneca

 


Código de ejemplo (ZIP):
 

Fichero con el código de ejemplo: firmas_sergio_Cache_ASP_cache.zip - 2.80 KB

El ejemplo está hecho con la versión Express de Visual Web Developer 2005

(MD5 checksum: E49274B91326BB9164A8A7FDC6B12D0A)

 


Ir al índice principal de el Guille