2011-01-11 11 views
8

estoy usando el atributo OutputCache en mi página web MVC de la siguiente manera:bypass OutputCache en ASP.NET MVC

[OutputCache(Duration = 5000, 
     VaryByParam = "name;region;model;id;op;content;featured;isStarred;page;size;")] 

Sin embargo a veces me gustaría pasar por alto la caché de resultados en su totalidad y forzar una zona de alcance de la base de datos. Esto es especialmente cierto para mi entorno de prueba, donde continuamente estoy cargando nuevos datos en la base de datos para la prueba.

¿Hay alguna manera en que podría omitir el caché en este caso?

Gracias.

Respuesta

2

Todo lo que necesitaba era usar una dependencia de caché. Necesitaba que este cambio se modificara en tiempo de ejecución, por lo que los archivos de configuración no eran una opción.

Agregué lo siguiente a la acción que quería tener una opción de "no-caché" activada.

Response.AddCacheItemDependency("Pages"); 

Y se creó la siguiente acción que puedo llamar para actualizar el caché.

public ActionResult RefreshCache() 
    { 
     HttpContext.Cache.Insert("Pages", DateTime.Now, null, 
           DateTime.MaxValue, TimeSpan.Zero, 
           CacheItemPriority.NotRemovable, 
           null); 
     Logger.Info("Cleansed cache"); 
     return RedirectToAction("HubContent"); 
    } 
10

En lugar de especificar todos los parámetros de la memoria caché de resultados en línea, en el atributo, puede usar un perfil OutputCache.

Los perfiles de la memoria caché de resultados le permiten poner toda su configuración de caché de salida en su web.config, darle un nombre al perfil y luego señalar ese perfil desde su atributo.

Una vez que tenga esa configuración, podría modificar la configuración en el archivo web.config que usa para depurar de modo que la duración del almacenamiento en caché sea de solo 1 segundo. Obviamente, dejaría su archivo web.config de producción con una duración mucho mayor.

Para obtener más información acerca de los perfiles, echa un vistazo a http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspx

+0

No puede hacer eso para los parciales. –

4

Si quería apagarlo por completo se puede utilizar

<caching> 
    <outputCache enableOutputCache="false" /> 
</caching> 

en su under.system.web web.config. Si lo que quería hacer desde el código (mediante un botón o algo más) también se puede hacer:

System.Configuration.Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/"); 
System.Web.Configuration.OutputCacheSection cacheSection = (System.Web.Configuration.OutputCacheSection)config.GetSection("system.web/caching/outputCache"); 
cacheSection.EnableOutputCache = true/false; 
config.Save(); 

Este será probablemente sólo funcionan en su máquina dev. La mayoría de los servidores están configurados para no permitir la edición de esa sección en machine.config.

+1

no lo apagaría ser 'enableOutputCache =" false "'? – Maslow

+0

1 o 6 meses después alguien llamó el error de copiar y pegar –

+0

Gracias mucho por el fragmento de código - esto hizo que fuera terriblemente fácil para mí para cambiar el escenario de las pruebas de rendimiento: -D – Oliver

1

Esto no responde exactamente a su pregunta, pero responde a su título (que no es "cómo borrar un elemento de la caché "): Se podría añadir un" VaryByParam ":

[OutputCache(Duration=5000,VaryByParam="YourExistingParams;CacheBypass")] 

entonces cuando y Si desea omitir el caché, simplemente pase el parámetro CacheBypass al valor de DateTime.UtcNow.Ticks (o cualquier cosa al azar) => por ejemplo: http://localhost/?CacheBypass=1234567890

+0

VaryByParam también tiene un comodín ('' *) para que no tiene que escribir todos sus parámetros. Esto caché por CUALQUIER parámetro. Utilizar con precaución sin embargo '[OutputCache (Duración = 5000, VaryByParam = "*")]' – blockloop

+0

Por supuesto, pero este comportamiento no puede ser querido (sobre todo si se utiliza GA consulta de seguimiento cadena). Atención: como se dijo, esto en realidad no responde la pregunta (pero responde el título) porque no elimina el elemento del caché, sería el único que vería la página actualizada. – Vincent

Cuestiones relacionadas