2012-10-17 68 views
6

輸出緩存是在ASP.NET MVC2中使用下面的代碼實現的。爲什麼GetVaryByCustomString不被調用

GetVaryByCustomString方法未被調用:將斷點放置到其第一行並且正在運行的應用程序顯示未達到斷點。 達到控制器索引()中的斷點。

如何在ASP.NET MVC2中使用VaryByCustom

控制器:

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

} 

回答

7

你的OutputCache定義是錯誤的。您必須指定Duration

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

現在您的覆蓋GetVaryByCustomString方法將被調用。另外不要忘記,GetVaryByCustomString方法只有在控制器動作完成後纔會被調用。

+0

謝謝。添加這個Vary之後:*頭部被髮送到瀏覽器,並且這會禁用瀏覽器緩存。如何使用VaryByCustom啓用瀏覽器緩存? – Andrus

1

我只想說其他2個原因

如果有任何[NoCache的]屬性項目,GetVaryByCustomString不會閃光。

如果你把

Location = OutputCacheLocation.Client, 

GetVaryByCustomString不會閃光。

0

,我最近進行的項目有一個全球性的過濾器防止輸出緩存從工作:

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

留言,這增加了過濾器,輸出緩存開始工作按預期的方式行之後。

相關問題