private bool ShouldUseOutputCache(ControllerContext controllerContext)
        {
            var routedContentLink = _contentRouteHelperAccessor().ContentLink;

            return(OutputCacheHandler.UseOutputCache(controllerContext.HttpContext.User, controllerContext.HttpContext, _duration) &&
                   !controllerContext.IsChildAction && !ContentReference.IsNullOrEmpty(routedContentLink));
        }
 public override void OnResultExecuted(ResultExecutedContext filterContext)
 {
     base.OnResultExecuted(filterContext);
     if (OutputCacheHandler.UseOutputCache(filterContext.HttpContext.User, filterContext.HttpContext, new TimeSpan(0, 0, Duration)))
     {
         var contentRenderingContext = filterContext.HttpContext.GetTrackingContext();
         if (!contentRenderingContext.UsesPersonalizationOrQuery)
         {
             AddDepedenciesToCache(filterContext.HttpContext);
         }
         var state = new ValidationState(contentRenderingContext.UsesPersonalizationOrQuery, ConfigurationSettings.Service);
         filterContext.HttpContext.Response.Cache.AddValidationCallback(new HttpCacheValidateHandler(ValidateOutputCache), state);
     }
 }
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            if (Disable)
            {
                return;
            }

            if (!_initialized)
            {
                //If no values are set on attrbute take default values from config
                if (Duration == 0)
                {
                    Duration = Convert.ToInt32(ConfigurationSettings.Service.HttpCacheExpiration.TotalSeconds);
                }
                if (String.IsNullOrEmpty(VaryByCustom))
                {
                    VaryByCustom = ConfigurationSettings.Service.HttpCacheVaryByCustom;
                }
                _initialized = true;
            }

            var contentLink = filterContext.RequestContext.GetContentLink();

            if (!ContentReference.IsNullOrEmpty(contentLink))
            {
                var versionable = ContentLoader.Service.Get <IContent>(contentLink) as IVersionable;
                if (versionable != null && versionable.StopPublish.HasValue)
                {
                    DateTime now = DateTime.Now;
                    if (versionable.StopPublish < now)
                    {
                        return;
                    }

                    if (versionable.StopPublish.Value < now.AddSeconds(Duration))
                    {
                        Duration = Convert.ToInt32((versionable.StopPublish.Value - now).TotalSeconds);
                    }
                }

                if (OutputCacheHandler.UseOutputCache(filterContext.HttpContext.User, filterContext.HttpContext, new TimeSpan(0, 0, Duration)))
                {
                    base.OnResultExecuting(filterContext);
                }
            }
        }
        public static void ValidateOutputCache(HttpContext context, object data, ref HttpValidationStatus validationStatus)
        {
            var httpContextBase = new HttpContextWrapper(context);
            var state           = data as ValidationState;

            if (state.UsesPersonalizationOrQuery || context.Cache[context.Request.RawUrl] == null)
            {
                validationStatus = HttpValidationStatus.Invalid;
            }
            else if (!OutputCacheHandler.UseOutputCache(context.User, httpContextBase, state.Settings.HttpCacheExpiration))
            {
                validationStatus = HttpValidationStatus.IgnoreThisRequest;
            }
            else
            {
                validationStatus = HttpValidationStatus.Valid;
            }
        }