Search code examples
c#asp.net.netcachingoutputcache

OutputCache attribute always has the previous duration set


For some reason the output cache keeps the two week duration I apply to an expired event, on an event in the future. Am I missing something in my custom output provider to stop the saving of the duration?

[ExpiredOutputCache(Duration = 3600, VaryByParam = "eventid;expired")]
        public virtual ActionResult GetDivisionsViews(int eventId, EventDivisionsViewModel viewModel)
        {

}

    public class ExpiredOutputCacheAttribute : OutputCacheAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                if((filterContext.HttpContext.Request.QueryString[Config.QueryString.Expired] != null && filterContext.HttpContext.Request.QueryString[Config.QueryString.Expired].To<DateTime>().Date < DateTime.Now.Date.Date) || 
                   (filterContext.RouteData.Values[Config.QueryString.Expired] != null && filterContext.RouteData.Values[Config.QueryString.Expired].To<DateTime>().Date < DateTime.Now.Date.Date))
                {
                    Duration = (int)Config.Cache.TwoWeeks * 60;
                }

                base.OnActionExecuting(filterContext);
            }
        }

Solution

  • I just did this.

    protected int OriginalDuration { get; set; }
    
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                if(OriginalDuration == 0)
                {
                    OriginalDuration = Duration;
                }
    
                if ((filterContext.HttpContext.Request.QueryString[Config.QueryString.Expired] != null && filterContext.HttpContext.Request.QueryString[Config.QueryString.Expired].To<DateTime>().Date < DateTime.Now.Date.Date) || 
                   (filterContext.RouteData.Values[Config.QueryString.Expired] != null && filterContext.RouteData.Values[Config.QueryString.Expired].To<DateTime>().Date < DateTime.Now.Date.Date))
                {
                    Duration = (int)Config.Cache.TwoWeeks * 60;
                }
                else
                {
                    Duration = OriginalDuration;
                }
    
                base.OnActionExecuting(filterContext);
            }