mvc habilitar control cache asp.net iis-6 outputcache

asp.net - habilitar - outputcache mvc 5



controlar mediante programación el almacenamiento en caché de resultados: deshabilite o habilite la memoria caché según el valor del parámetro (5)

Aún puede usar la directiva de salida de caché, y en mi opinión, en lugar de ensuciar el código de su página con un montón de tuercas y tornillos de almacenamiento en caché, es mejor ir con una solución reutilizable basada en el manejo de esto en Global.asax como lo hace normalmente sería cualquier escenario VaryByCustom.

Entonces, por ejemplo, si está utilizando un enfoque de paginación con un repetidor, es posible que simplemente en su escenario de búsqueda desee excluir de la caché cualquier devolución de una página en particular. Here hay un ejemplo de código que hace justamente eso. El enfoque simplemente requiere usar el objeto HttpContext para acceder a Response.Cache.SetNoServerCaching (), después de capturar los criterios para los que desea evitar el almacenamiento en caché. Espero que esto ayude.

Tenemos un escenario de comercio electrónico bastante estándar con listas de productos paginados dentro de categorías. Para bien o para mal, alrededor del 80% de los visitantes nunca navegan más allá de la primera página, dependiendo de la categoría, puede haber entre 5 y 10 páginas más de resultados que se ven con mucha menos frecuencia. (Sí, optimizamos lo que aparece en la primera página y tenemos una buena búsqueda, pero esa es una discusión diferente)

No podemos almacenar en caché cada página de resultados, porque estamos limitados por la memoria, pero el beneficio de almacenar en caché solo la primera página de resultados para cada categoría sería enorme.

Sé que podría hacer algo similar utilizando el almacenamiento en caché de objetos para almacenar los conjuntos de datos en cuestión, pero ¿es esto posible usar el almacenamiento en caché de resultados, quizás utilizando el objeto response.Cache?

¿Dónde en el ciclo de vida de la página se podría hacer esto? Pre-render?

Muy simplificado, la URL es algo así como "/ ProductList? Category = something & Page = 1" Y me gustaría algo así como lógica (pseudocódigo):

If paramater "Page" equals 1 Use output caching: vary by param = "categoryName; page" else Don''t use caching at all, just render the page from scratch.

Estamos utilizando ASP.NET 2.0, en IIS 6 / win2003.


Creo que debería poder usar la directiva OutputCache con la propiedad VaryByParam establecida en una lista de cadenas separadas por punto y coma que se usa para variar la memoria caché de salida.

¿A menos que solo quisieras cachear solo cuando Page == 1?



En lugar de utilizar la directiva OutputCache, puede hacer lo mismo mediante programación, de la siguiente manera:

if (yourArbitraryCondition) { OutputCacheParameters outputCacheSettings = new OutputCacheParameters(); outputCacheSettings.Duration = 60; InitOutputCache(outputCacheSettings); }

Hacer esto desde OnInit debería funcionar bien. Y, obviamente, puede modificar el comportamiento del almacenamiento en caché configurando las distintas propiedades en el OutputCacheParameter, que tiene todos los mismos mandos que la directiva (de hecho, eso es lo que generamos cuando usa la directiva).

El punto clave es que solo está ejecutando condicionalmente esta lógica, mientras que la directiva la hace incondicional.

ACTUALIZAR:

Como alternativa, puede utilizar la API de caché de bajo nivel en la que se basa el código anterior. p.ej

HttpCachePolicy cache = Response.Cache; cache.SetCacheability(HttpCacheability.Public); cache.SetExpires(Context.Timestamp.AddSeconds(60)); cache.VaryByParams["categoryName"] = true;

Básicamente, es otra forma de hacer lo mismo, sin usar ninguna API marcada como ''no debería llamarse''. Al final, de cualquier manera funcionará, así que elige tu opción.


Edición: Me gusta la respuesta de David Ebbo mucho mejor que la mía.

Usted podría usar

<%@ OutputCache Duration="60" VaryByParam="none" VaryByCustom="pageOne" %>

e implementarlo de una manera que devuelva una clave fija para la primera página y una clave aleatoria para todas las demás páginas. Puede (y debe ) dejar que el mecanismo de scavenging se ocupe de la memoria, pero puede usar HttpResponse.RemoveOutputCacheItem para eliminar elementos de caché si es necesario.

public override string GetVaryByCustomString(HttpContext ctx, string custom) { if(custom == "pageOne") { if(ctx.Request["page"] == "1") { return "1"; } HttpResponse.RemoveOutputCacheItem("/Default.aspx"); return Guid.NewGuid().ToString(); } return base.GetVaryByCustomString(ctx, custom); }