Un ejemplo de VaryByCustom

Una de las opciones de la directiva OutputCache consiste en el atributo VaryByCustom. El atributo VaryByCustom permite definir un string para el cual almacenar la pagina en cache. Es decir, para cada valor de dicho string se almacenara una pagina en la cache. La cantidad de items en la cache seria igual a la cantidad de posibles valores que almacena la variable UserCookie.

La siguiente pagina aspx muestra la fecha en el label LblDate. La directiva OutputCache especifica el atributo VaryByCustom con el valor "UserCookie".

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="VaryByCustom1.aspx.cs"

    Inherits="VaryByCustom1" %>

<%@ OutputCache Duration="3600" VaryByCustom="UserCookie" VaryByParam="none" %>

<!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>Untitled Page</title>

</head>

<body>

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

    <div>

        <asp:Label ID="LblDate" runat="Server">

        </asp:Label>

    </div>

    </form>

</body>

</html>

El codigo asociado a la pagina solo implementa el manejador de evento para el evento Load de la pagina:

    protected void Page_Load(object sender, EventArgs e)

    {

        this.LblDate.Text = DateTime.Now.ToString();

 

        if(Request.Cookies["usercookie"]!=null)

            Request.Cookies.Add(new HttpCookie("usercookie", "juan"));

    }

La primer sentencia setea la fecha. La segunda, chequea la existencia de la cookie usercookie y la agregua si no existe.
Para que todo funcione se debe escribir codigo el metodo GetVaryByCustomString dentro del archivo global.asax. El metodo GetVaryByCustomString se encarga de devolver el valor actual para la variable usercookie. Por lo tanto, cada posible valor de usercookie determinara un item en el cache.
El siguiente codigo muestra un ejemplo de dicho metodo:

    public override string GetVaryByCustomString(HttpContext context, string custom) {

 

        if (custom.ToLower() == "usercookie") {

            HttpCookie cookie = context.Request.Cookies["usercookie"];

 

            if (cookie != null) {

                return cookie.Value;

            }

        }

        return base.GetVaryByCustomString(context, custom);

    }

Si probamos el codigo veremos que la fecha no cambia ya que se almacenado en cache la pagina. Podemos cambiar el valor de usercookie en el archivo de codigo asociado de "juan" a "pedro" y veremos como la fecha se actualiza para volver a ser almacenada y servida desde el cache.

Resumen

Esta tecnica es muy util ya que nos proporciona un control total sobre las paginas que van a la cache permitiendonos decidir en funcion de cualquier variable.