2009-07-22 5 views
53

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?Come cancellare in modo programmato outputcache per il metodo di azione del controllore

[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 utilizzare HttpResponse.RemoveOutputCacheItem(string path) per cancellarlo, ma sto avendo difficoltà a capire ciò che il percorso dovrebbe essere quello di mappare al metodo di azione. Ho intenzione di riprovare con la pagina di aspx resa da ViewName.

Probabilmente inserirò manualmente l'output di RenderToString nello HttpContext.Cache invece se non riesco a capirlo.

Aggiornamento

Si prega di notare che l'OutputCache è VaryByParam, e testare un percorso hardcoded "/ regolatore/azione" in realtà non cancellare l'OutputCache, così sembra che esso deve corrispondere "/ regolatore/azione/param1/param2" .

Ciò significa che probabilmente dovrete tornare al livello di caching e object cache manualmente l'uscita per RenderToString() :(

+0

Prova ad aggiungere 'location =" Server "' all'attributo OutputCache: non è possibile cancellare la cache del client dal server –

risposta

48

Prova questa

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); 

AGGIORNATO:

Prova questo:

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

In caso contrario, la cancellazione della cache non funzionerà perché hai memorizzati nella cache l'output HTML sul computer dell'utente

+0

OK, ci provo, grazie! –

+0

Naturalmente, ora sto avendo problemi a capire come istanziare un UrlHelper all'interno del webservice che ha la funzione. Arg. –

+0

Ho rinunciato a quel tentativo. Non sono riuscito a trovare alcun modo per far passare RequestContext nel metodo del costruttore UrlHelper. Così l'ho testato con hard coding in "/ controller/action". Questo non mostra alcun errore, ma non cancella la cache. –

2

Un'altra opzione è quella di utilizzare VaryByCustom per l'OutputCache e gestire il invalidazione di alcuni elementi della cache lì.

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

3

credo corretto flusso è:

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

Grazie, questo è molto risposta migliore, perché funziona per tutte le località. Response.Cache.SetNoStore() – buffjape

1

aggiungere il codice per AjaxHtmlOutputMethod

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

Per cancellare uscita cache è ora possibile utilizzare

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

A seguito della risposta accettata, per sostenere i parametri 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 OutputCacheLocation:

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

Quando SetNoStore() e SetNoServerCaching() sono chiamati, impediscono la richiesta corrente viene 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 le risposte nella cache, ma non se contengono messaggi di errore.

Problemi correlati