Search code examples
c#asp.net-mvcasp.net-mvc-2outputcache

Why GetVaryByCustomString is not called


output cache is implemented in ASP.NET MVC2 using code below.

GetVaryByCustomString method is not called: placing breakpoint to its first line and running application shows that breakpoint is not reached. Breakpoint in controller Index() is reached.

How to use 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);
    }

}

Solution

  • Your OutputCache definition is wrong. You must specify the Duration:

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

    Now your overridden GetVaryByCustomString method will be called. Also don't forget that the GetVaryByCustomString method will be called only after the controller action has finished executing.