2010-01-17 13 views
5

¿Hay una manera fácil de almacenar en caché toda la página ASP.NET solo para usuarios anónimos (se usa autenticación de formularios)?Caché ASP.NET página para usuarios anónimos solo

Contexto: Estoy creando un sitio web donde las páginas que se muestran a los usuarios anónimos son en su mayoría completamente estáticas, pero las mismas páginas que se muestran para los usuarios que han iniciado sesión no.

Por supuesto que puedo hacer esto manualmente a través del código, pero pensé que podría haber una manera mejor/más fácil/más rápida.

+0

¿Alguna vez resolvió este problema? Tenemos una necesidad similar que varyByCustom no es la respuesta para. –

+0

Actualmente utilizo la solución de código subyacente, donde puedo decidir fácilmente si quiero almacenar en caché la página o no. Si el usuario no está conectado, guardo en caché. Si el usuario está conectado, la memoria caché está desactivada para una página completa (y en su lugar solo almacena partes "estáticas"). Después de recibir la respuesta a continuación, busqué una solución sin código subyacente, pero no encontré nada útil. Después de todo, una solución de código subyacente también es muy clara y no tiene desventajas importantes sobre ASP.NET puro. –

+0

¿Podría compartir su solución de código subyacente? ¿Cómo controlas el caché de esa manera? –

Respuesta

1

Puede usar VaryByCustom, y usar una clave como username.

+0

El problema con esto es que también almacenará en caché las páginas que se muestran a los usuarios que han iniciado sesión. En mi caso, esas páginas ya están parcialmente en caché, mientras que otras no se pueden almacenar en caché (ni siquiera para el mismo usuario). Por supuesto, puedo establecer la clave VaryByCustom en un valor aleatorio si el usuario está conectado, pero tendrá enormes problemas de rendimiento. –

3

estoy usando asp.net MVC, así que hice esto en mi controlador de

if (User.Identity.IsAuthenticated) { 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1)); 
    Response.Cache.SetNoStore(); 
    Response.Cache.SetNoServerCaching(); 
} 
else { 
    Response.Cache.VaryByParams["id"] = true; // this is a details page 
    Response.Cache.SetVaryByCustom("username"); // see global.asax.cs GetVaryByCustomString() 
    Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); 
    Response.Cache.SetCacheability(HttpCacheability.Server); 
    Response.Cache.SetValidUntilExpires(true); 
} 

La razón por la que hice de esta manera (en lugar de forma declarativa) era también necesitaba la capacidad para encenderlo y fuera de configuración (no se muestra aquí, pero hay una verificación adicional en la variable si para mi configuración).

Aún necesita cambiar según el nombre de usuario, de lo contrario no ejecutará este código cuando aparezca un usuario conectado. Mi función GetVaryByCustomString devuelve "anónimo" cuando no está autenticado o el nombre de los usuarios cuando está disponible.

+0

Gracias, esto funcionó de maravillas para mí. – Dusda

1

No hay nada que nos impida extender el atributo existente con el comportamiento deseado,

por ejemplo:

public class AnonymousOutputCacheAttribute : OutputCacheAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if(filterContext.HttpContext.User.Identity.IsAuthenticated) 
      return; 

     base.OnActionExecuting(filterContext); 
    } 
} 

no he probado esto, pero no veo razón para que esta shouldn' t trabajo.

Cuestiones relacionadas