2012-07-25 10 views
5

¿Es posible variar el caché de salida en MVC en función de ciertos valores en la sesión? He leído mucho sobre el uso de la funcionalidad varybycustom y sobreescribiendo GetVaryByCustomString en Global.asax, pero la sesión no está disponible en este momento.MVC OutputCache basado en los valores de sesión

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if (custom == "somekey") 
     //Want to check the session here (but it isn't available). 

    return base.GetVaryByCustomString(context, custom); 
} 

Entiendo que esto se debe a que la sesión no se crea hasta más adelante en la canalización de la solicitud.

Mi preocupación es que sin variar la memoria caché basada en la sesión del usuario, la página (que cambia en función de lo que el usuario tenga en la sesión, tenga HTML adicional específico para ese usuario, etc.) se almacenará en caché (como la URL lo mismo) y atendido por nuestro equilibrador de carga, servidores proxy, etc. y luego atendió a otras solicitudes con la información de sesión de otras personas en la página.

El motivo por el que la URL es la misma es que el usuario ingresa como 'invitado', ingresa cierta información (POST), esta se valida y se almacena en la sesión y luego se redirige a la misma página (que ahora debe ser específico para el usuario en función de los datos de la sesión).

La página en sí misma debe almacenarse en caché normalmente porque si un "invitado" visita la misma URL, debería publicar la misma página "estándar" cada vez.

¿Es posible variar el almacenamiento en caché de esta manera?

Respuesta

0

Debería tener en cuenta "Caché de buñuelos", pero esto no es compatible con ASP.NET MVC 3, al menos no de fábrica. Afortunadamente, alguien ya resolvió este problema para que vea MvcDonutCaching

Leo que ASP.NET MVC 4 incluirá el "Caché de caché de buñuelos" de fábrica, pero no puedo decir si está en el RC actual o no.

2

Si desea personalizar la salida de la memoria caché por usuario, es mejor que configure la Ubicación en OutputCacheLocation.Client como se muestra a continuación. Más información here

[OutputCache(Duration=3600, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)] 
    public string GetName() 
    { 
     return "Hi " + User.Identity.Name; 
    } 
Cuestiones relacionadas