2012-04-16 13 views
6

Estamos ejecutando una compilación de sitio bastante grande con ASP.NET MVC 3 y AppFabric como una solución de almacenamiento en caché distribuida. Hemos implementado un OutputCacheAdapter personalizado para usar nuestro clúster AppFabric.ASP.NET MVC golpea la memoria de salida para cada acción

Estamos viendo que ASP.NET llama al método OutputCacheProvider.Get() para cada acción, incluso si esa acción NO está decorada con @OutputCacheAttribute.

Eso no es un gran problema si usa el proveedor predeterminado de caché de salida, pero es cuando está ejecutando un proveedor de caché de salida que reside en máquinas separadas.

Respuesta

4

Es por diseño que la caché de salida se verifica primero para una copia en caché de la página. Si hay una copia en caché, se devuelve y no se ejecuta nada más. En particular, no se deriva, inspecciona ni ejecuta ningún controlador ni acción de controlador. Esto sucede solo si la página no está en caché.

Tendrá que cambiar su proveedor de caché para que pueda determinar rápidamente si una página se puede almacenar en caché. Solo si es una página de caché, entonces debería ir y verificar la caché distribuida. Esta verificación no puede basarse en el OutputCacheAttribute ya que no están disponibles durante esta parte del proceso de solicitud. En cambio, la verificación rápida debe hacerse con la URL, las cookies y otra información del encabezado HTML.

+0

Sí, eso suena como una buena explicación. Sin embargo, en realidad no se puede hacer mucho con eso, ya sea que acepte la penalización de rendimiento, regrese al OutputCacheProvider predeterminado o proporcione algo así como una lista en blanco y negro para las URLS. – TheNameless

+1

@TheNameless No lo he hecho yo mismo pero no puede obtener los parámetros de ruta [de alguna manera] (http://www.scottschluer.com/creating-a-routedata-instance-from-a-url/) y luego usar reflexión para examinar los atributos en el controlador/acción? No es ideal, pero probablemente sea más rápido que una red de ida y vuelta. – Basic

0

Puede usar el atributo de caché de salida Donut Cache que le permite definir un prefijo para las claves de caché de salida. Entonces, en su proveedor personalizado simplemente obtenga/configure la caché si la clave de caché comienza con su propio prefijo.

Cuestiones relacionadas