2012-10-17 8 views
6

Ausgabecache ist in ASP.NET MVC2 mithilfe des folgenden Codes implementiert.Warum GetVaryByCustomString nicht aufgerufen wird

GetVaryByCustomString Methode wird nicht aufgerufen: Haltepunkt in die erste Zeile setzen und laufende Anwendung zeigt, dass der Haltepunkt nicht erreicht wird. Breakpoint im Controller Index() ist erreicht.

Wie wird VaryByCustom in ASP.NET MVC2 verwendet?

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

} 

Antwort

7

Ihre Output Definition ist falsch. Sie müssen angeben, die Duration:

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

Jetzt aufgerufen werden Ihre überschrieben GetVaryByCustomString Methode. Vergessen Sie auch nicht, dass die Methode GetVaryByCustomString erst aufgerufen wird, nachdem die Controlleraktion beendet wurde.

+0

Vielen Dank. Nach dem Hinzufügen dieser Vary: * Header wird an den Browser gesendet und dies deaktiviert den Browser-Cache. Wie kann ich den Browser-Cache mit VaryByCustom aktivieren? – Andrus

1

Ich möchte nur zwei andere Ursachen

erwähnen Wenn es irgendeine ist [NoCache] Attribut in Projekt, GetVaryByCustomString wird nicht ausgelöst.

Wenn Sie

Location = OutputCacheLocation.Client, 

GetVaryByCustomString nicht Feuer.

0

Ein Projekt, das ich gearbeitet habe, hatte vor kurzem einen globalen Filter verhindert Ausgabe Caching von der Arbeit:

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

nach der Zeile zu kommentieren, die den Filter fügt hinzu Ausgabe Caching gestartet wie erwartet funktioniert.