2009-07-22 18 views
53

Si la acción del controlador tiene el atributo OutputCache especificado en una acción, ¿hay alguna manera de borrar el caché de salida sin tener que reiniciar IIS?Cómo borrar mediante programación el outputcache para el método de acción del controlador

[OutputCache (Duration=3600,VaryByParam="param1;param2")] 
public string AjaxHtmlOutputMethod(string param1, string param2) 
{ 
    var someModel = SomeModel.Find(param1, param2); 

    //set up ViewData 
    ... 

    return RenderToString("ViewName", someModel); 
} 

estoy mirando usando HttpResponse.RemoveOutputCacheItem(string path) para desactivarla, pero estoy teniendo problemas para averiguar lo que la ruta debe ser hacer un mapa con el método de acción. Voy a intentarlo de nuevo con la página aspx que es renderizada por ViewName.

Posiblemente voy a insertar manualmente la salida de RenderToString en el HttpContext.Cache en su lugar, si no puedo resolver esto.

actualización

Tenga en cuenta que el OutputCache es VaryByParam, y prueba de un camino codificado "/ controlador/acción" en realidad no borrar la outputcache, por lo que parece que tiene que coincidir con "/ controlador/acción/param1/param2 ".

Eso significa que probablemente voy a tener que volver a objetar el almacenamiento en caché de nivel y almacenar en caché manualmente la salida de RenderToString() :(

+0

Trate de agregar 'location =" Server "' al atributo OutputCache - no puede borrar el caché del cliente del servidor –

Respuesta

48

probar este

var urlToRemove = Url.Action("AjaxHtmlOutputMethod", "Controller"); 
HttpResponse.RemoveOutputCacheItem(urlToRemove); 

Actualizado:

var requestContext = new System.Web.Routing.RequestContext(
    new HttpContextWrapper(System.Web.HttpContext.Current), 
    new System.Web.Routing.RouteData()); 

var Url = new UrlHelper(requestContext); 

ACTUALIZADO:

Prueba esto:

[OutputCache(Location= System.Web.UI.OutputCacheLocation.Server, Duration=3600,VaryByParam="param1;param2")] 

lo contrario, la eliminación de caché no va a funcionar porque se ha en caché la salida HTML en la máquina del usuario

+0

OK, voy a intentarlo, ¡gracias! –

+0

Por supuesto, ahora estoy teniendo problemas para averiguar cómo crear una instancia de un UrlHelper dentro del servicio web que tiene la función. Arg. –

+0

Me rendí en ese intento. No pude encontrar ninguna manera de hacer que RequestContext pase al método de constructor UrlHelper. Así que lo probé mediante codificación en "/ controller/action". Esto no muestra ningún error, pero no borra la caché. –

2

Otra opción es utilizar VaryByCustom para la OutputCache y manejar la invalidación de ciertos elementos de caché allí.

Tal vez funcione para usted, pero no es una solución general al problema

3

Creo flujo correcto es:

filterContext.HttpContext.Response.Cache.SetNoStore() 
+0

Gracias, esto es mucho mejor respuesta, porque funciona para todas las ubicaciones. Response.Cache.SetNoStore() – buffjape

1

añadir código a AjaxHtmlOutputMethod

HttpContext.Cache.Insert("Page", 1); 
Response.AddCacheItemDependency("Page"); 

Para borrar de salida caché ahora puede usar

HttpContext.Cache.Remove("Page"); 
3

En relación con la respuesta aceptada, para apoyar parámetros VaryByParam:

[OutputCache (Duration=3600, VaryByParam="param1;param2", Location = OutputCacheLocation.Server)] 
    public string AjaxHtmlOutputMethod(string param1, string param2) 
    { 
     object routeValues = new { param1 = param1, param2 = param2 }; 

     string url = Url.Action("AjaxHtmlOutputMethod", "Controller", routeValues); 

     Response.RemoveOutputCacheItem(url); 
    } 

Sin embargo la respuesta de Egor es mucho mejor, porque es compatible con todos los valores OutputCacheLocation:

[OutputCache (Duration=3600, VaryByParam="param1;param2")] 
    public string AjaxHtmlOutputMethod(string param1, string param2) 
    { 
     if (error) 
     { 
      Response.Cache.SetNoStore(); 
      Response.Cache.SetNoServerCaching(); 
     } 
    } 

Cuando SetNoStore() y SetNoServerCaching() son llamados, Impiden la Solicitud actual está en caché.Las solicitudes adicionales se almacenarán en caché, a menos que las funciones también se soliciten para esas solicitudes.

Esto es ideal para manejar situaciones de error, cuando normalmente desea almacenar respuestas en caché, pero no si contienen mensajes de error.

Cuestiones relacionadas