2012-10-17 12 views
6

出力キャッシュは、以下のコードを使用してASP.NET MVC2に実装されています。GetVaryByCustomStringが呼び出されない理由

GetVaryByCustomStringメソッドは呼び出されません。最初の行にブレークポイントを配置し、アプリケーションを実行するとブレークポイントに達していないことが示されます。 コントローラIndex()内のブレークポイントに達しました。

VaryByCustomをASP.NET MVC2で使用するには?

コントローラー:

 [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

は、私は発生しません、プロジェクト内の任意の[NoCache命令]属性、GetVaryByCustomStringがある場合は2つの他の原因

を言及したいと思います。

あなたが入れた場合

Location = OutputCacheLocation.Client, 

GetVaryByCustomStringは発生しません。期待通りに出力キャッシュが働き始め、フィルタを追加する行をコメントにした後

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

0

私は最近に働いていたプロジェクトは、作業から出力キャッシュを防止グローバルフィルタを持っていました。

関連する問題