2012-10-17 31 views
6

la cache di output è implementata in ASP.NET MVC2 utilizzando il codice riportato di seguito.Perché GetVaryByCustomString non viene chiamato

GetVaryByCustomString metodo non chiamato: posizionare il punto di interruzione sulla prima riga e l'applicazione in esecuzione mostra che il punto di interruzione non è stato raggiunto. È stato raggiunto il punto di interruzione nel controller Indice().

Come utilizzare VaryByCustom in ASP.NET MVC2?

Controller:

 [OutputCache(VaryByCustom = "user")] 
     public ActionResult Index(string _entity, string id) 
     { 
... 

Global.asax.cs:

public class MvcApplication : System.Web.HttpApplication 
{ 
    public override string GetVaryByCustomString(HttpContext context, string arg) 
    { 
     if (arg == "user") 
     { 
      HttpCookie cookie = context.Request.Cookies["Company"]; 
      if (cookie != null) 
       return Thread.CurrentPrincipal.Identity.Name + "," + cookie.Value; 
      return Thread.CurrentPrincipal.Identity.Name; 
     } 
     return base.GetVaryByCustomString(context, arg); 
    } 

} 

risposta

7

tua definizione OutputCache è sbagliato. È necessario specificare il Duration:

[OutputCache(VaryByCustom = "user", Duration = 50)] 
public ActionResult Index(string _entity, string id) 

Ora il vostro GetVaryByCustomString metodo ignorato verrà chiamato. Inoltre, non dimenticare che il metodo GetVaryByCustomString verrà chiamato solo dopo che l'azione del controller ha terminato l'esecuzione.

+0

Grazie. Dopo aver aggiunto questo Vary: * l'intestazione viene inviata al browser e questo disabilita la cache del browser. Come abilitare la cache del browser con VaryByCustom? – Andrus

1

Voglio solo citare 2 altre cause

Se c'è qualche [NoCache] attributo nel progetto, GetVaryByCustomString non scatta.

Se mettete

Location = OutputCacheLocation.Client, 

GetVaryByCustomString non scatta mai.

0

Un progetto che ho lavorato di recente avuto un filtro globale impedendo la cache di output di lavorare:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new NoCacheResponseAttribute()); 
    } 
} 

public class NoCacheResponseAttribute : BaseActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var response = filterContext.RequestContext.HttpContext.Response; 
     response.Cache.SetCacheability(HttpCacheability.NoCache); 
     response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1)); 
     response.Cache.SetNoStore(); 
    } 
} 

Dopo aver commentato la linea che aggiunge il filtro, in uscita il caching ha iniziato a lavorare come previsto.

Problemi correlati