2011-06-01 18 views
5

Me falta un poco de comprensión fundamental del almacenamiento en caché de resultados de ASP.NET.Diferentes políticas de caché de servidor y cliente en ASP.NET 4.0

En mi caso, tengo recursos que están muy vinculados a mi clave VaryByCustom. Del lado del servidor, me encantaría que estos se guarden en la memoria indefinidamente hasta que esa clave cambie. No hay motivo para que esas entradas en caché se purguen en un temporizador.

Los clientes, sin embargo, deben registrarse una vez por hora para obtener lo que el servidor considera que es el contenido más reciente.

Si configuro mi duración en 1 hora, sé que establece correctamente el encabezado de caducidad en el cliente. ¿Pero también desaloja el caché del lado del servidor? ¿Hay alguna forma de garantizar que la respuesta permanezca almacenada en caché en el servidor hasta que se modifiquen mis VaryByCustom, pero aún permita una caducidad más frecuente en el lado del cliente?

+0

Esta es una buena pregunta, pero todavía no estoy cerca de una respuesta. He estado tratando de configurar un escenario de prueba. ¿Puede publicar su directiva '@ OutputCache' y la función 'GetVaryByCustomString' Override? PD: IMO La literatura de MSDN sobre almacenamiento en caché parece ser una carga confusa de basura. – pseudocoder

Respuesta

0

Lo importante a tener en cuenta aquí es que si su VaryByCustom cambia, asp.net almacena una versión separada de la página en caché.

Por lo tanto, supongamos que VaryByCustom- "custom1" con Duration = "60" se almacenará en caché durante 60 segundos.

Mientras tanto si su VaryByCustom cambia a "custom2" con duration = "60" asp.net almacenará una copia separada en la memoria caché, que es diferente de la memoria caché de "custom1" y esta versión separada se almacenará en caché para 60 segundos.

Una manera fácil de probar esto es cambiando VaryByCustom basado en el navegador.

En Global.asax

public override string GetVaryByCustomString(HttpContext context, string custom) 
     { 
      if (custom == "browser") 
      { 
       string browserName; 
       browserName = Context.Request.Browser.Browser; 
       browserName += Context.Request.Browser.MajorVersion.ToString(); 

       return browserName; 
      } 
      else 
      { 
       return base.GetVaryByCustomString(context, custom); 
      } 

     } 

Aspx

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" 
    CodeBehind="Default.aspx.cs" Inherits="WebFormsPlayGround._Default" %> 
    <%@ OutputCache Duration="40" VaryByParam="None" VaryByCustom="browser" %> 

carga de la página

protected void Page_Load(object sender, EventArgs e) 
     { 
      lblTime.Text = "The time now is: <br/>"; 
      lblTime.Text += DateTime.Now.ToString(); 
     } 

que no he incluido el marcado de asp: Label en el aspx, pero espero que se obtiene la idea general.

Cuestiones relacionadas