Come cancellare programmaticamente outputcache per il metodo di azione del controller

Se l’azione del controller ha l’attributo OutputCache specificato su un’azione, esiste un modo per svuotare la cache di output senza dover riavviare 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 ); } 

Sto cercando di usare HttpResponse.RemoveOutputCacheItem(string path) per cancellarlo, ma ho difficoltà a capire quale dovrebbe essere il percorso per mapparlo al metodo di azione. Ho intenzione di riprovare con la pagina di aspx resa da ViewName.

Forse inserirò manualmente l’output di RenderToString in HttpContext.Cache se non riesco a capirlo.

Aggiornare

Si noti che OutputCache è VaryByParam e testare un percorso hardcoded “/ controller / action” in realtà non cancella la cache di output, quindi sembra che debba corrispondere a “/ controller / action / param1 / param2”.

Ciò significa che probabilmente dovrò ripristinare la cache a livello di object e mettere manualmente in cache l’output per RenderToString() 🙁

Prova questo

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

AGGIORNAMENTO:

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

AGGIORNAMENTO:

Prova questo:

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

In caso contrario, l’eliminazione della cache non funzionerà perché hai memorizzato nella cache l’output HTML sul computer dell’utente

Oltre alla risposta accettata, per supportare i parametri di 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); } 

Tuttavia la risposta di Egor è molto meglio, perché supporta tutti i valori di OutputCacheLocation:

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

Quando vengono chiamati SetNoStore () e SetNoServerCaching () , impediscono la richiesta corrente di essere memorizzata nella cache. Ulteriori richieste verranno memorizzate nella cache, a meno che le funzioni non vengano chiamate anche per quelle richieste.

Questo è l’ideale per gestire le situazioni di errore, quando normalmente si desidera memorizzare nella cache le risposte, ma non se contengono messaggi di errore.

Penso che il stream corretto sia:

 filterContext.HttpContext.Response.Cache.SetNoStore() 

Un’altra opzione è utilizzare VaryByCustom per OutputCache e gestire l’invalidazione di alcuni elementi della cache.

Forse funziona per te, ma non è una soluzione generale al tuo problema

Aggiungi codice ad AjaxHtmlOutputMethod

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

Per cancellare la cache di output che ora puoi usare

 HttpContext.Cache.Remove("Page");