Cómo borrar programáticamente el caché de salida para el método de acción del controlador

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?

[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 buscando usar HttpResponse.RemoveOutputCacheItem(string path) para borrarlo, pero estoy teniendo problemas para averiguar cuál debería ser la ruta para asignarlo al método de acción. Voy a intentarlo de nuevo con la página aspx que es renderizada por ViewName.

Posiblemente inserte manualmente la salida de RenderToString en HttpContext.Cache si no puedo resolver esto.

Actualizar

Tenga en cuenta que OutputCache es VaryByParam, y probar una ruta codificada “/ controller / action” no elimina el caché de salida, por lo que parece que tiene que coincidir con “/ controller / action / param1 / param2”.

Eso significa que probablemente tendré que volver al almacenamiento en caché de nivel de objeto y almacenar en caché manualmente la salida para RenderToString() 🙁

Prueba esto

 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")] 

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

Además de la respuesta aceptada, para admitir los parámetros de 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, ya que admite todos los valores de OutputCacheLocation:

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

Cuando se invoca SetNoStore () y SetNoServerCaching () , impiden que la Solicitud actual se guarde 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.

Creo que el flujo correcto es:

 filterContext.HttpContext.Response.Cache.SetNoStore() 

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

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

Agregar código a AjaxHtmlOutputMethod

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

Para borrar el caché de salida, ahora puede usar

 HttpContext.Cache.Remove("Page");