2011-01-16 28 views
8

Estoy escribiendo un sitio ASP.NET MVC que incluye la posibilidad de que los usuarios creen cuentas e inicien sesión. Como también quiero almacenar en caché el sitio agresivamente, estoy ejecutando en algunos problemas para mezclar el almacenamiento en caché con la autenticación.dilema OutputCache con autenticación en ASP.NET MVC

En cada página, en la parte superior, si el usuario está conectado, obtengo su nombre de usuario, un enlace a su perfil y un enlace para cerrar la sesión. Si no están conectados, obtengo un enlace de inicio de sesión estándar. Además, en la página misma, algunos contenidos no se muestran a usuarios no autenticados, mientras que otros contenidos dependen de qué usuario haya iniciado sesión.

Intenté por primera vez resolver este problema hace algún tiempo preguntando al equipo Stack Overflow cómo lo resolvieron el problema. Jeff respondió que, básicamente, no almacenan en caché para usuarios no autenticados. Por lo tanto, escribí un atributo que se deriva de OutputCacheAttribute pero cancela el almacenamiento en caché si el usuario ha iniciado sesión en.

Actualmente, estoy usando ese atributo, pero estoy obteniendo resultados incorrectos en algunos casos. Por ejemplo, el usuario puede visitar una página, luego iniciar sesión, luego visitar la página nuevamente, solo para ver el enlace de inicio de sesión en la parte superior, en lugar de su nombre de usuario.

Estas son algunas de las soluciones que estoy considerando:

  • Configuración del tipo de HttpCacheability o Cache-Control-private, en lugar de public. De esta forma, la respuesta solo se almacena en caché del lado del cliente. ¿Esto solucionará el problema? Si lo hace, ¿tendrá esto un efecto en la eficacia del almacenamiento en caché? Me he dado cuenta de que Stack Overflow parece usar public, sin embargo.
  • Configurando un parámetro VaryByCustom para caché de forma diferente para cada usuario, como in this tutorial. ¿Ayudará esto, a la vez que se mantiene la eficiencia y efectividad del almacenamiento en caché?

¡Gracias de antemano!

Respuesta

9

Según la estructura de su aplicación, puede tener sentido almacenar en caché los datos en lugar de las vistas.

Dado que las vistas son muy simples y el acceso a la base de datos generalmente toma la mayor parte del tiempo requerido para representar una página, puede obtener la mayor ventaja del almacenamiento en caché de salida almacenando el modelo en su controladora, y cualquier parte incachable de la vista no se verá afectado para que pueda almacenar en caché el contenido público que ven los usuarios autenticados.

También hay maneras de hacer que la producción de trabajo de almacenamiento en caché con vistas parciales, pero en mi opinión, añaden más complejidad que realmente está justificada.

Cuestiones relacionadas