Disabling Cache for Test Driven (page with active A/B test) content
Caching is a great feature to improve the site performance. But recently we faced issue with test driven content being cached. The user was seeing the same test content that get loaded first because it get cached. And, there were no good solution to vary content based on test driven content. So, we came up with a solution to disable cache for test driven content (page with active A/B testing).
In order to do that you need to find if there is any active test for context item. I created an attribute by inheriting from default ContentOutputCacheAttribute.
public class CustomContentOutputCacheAttribute : ContentOutputCacheAttribute
{
private static readonly Injected<IMarketingTestingWebRepository> _marketingTestingWebRepository;
public CustomContentOutputCacheAttribute()
{
this.UseOutputCacheValidator = UseOutputCache;
}
private static bool UseOutputCache(IPrincipal principal, HttpContextBase context, TimeSpan duration)
{
var url = context.Request.Url?.ToString();
var content = UrlResolver.Current.Route(new UrlBuilder(url));
if (content == null) return false;
return !_marketingTestingWebRepository.Service.GetActiveTestsByOriginalItemId(content.ContentGuid).Any();
}
}
Now, next step is apply this attribute to your Page controller Index method. You can see the test content is not loading from cached.
public class StoryPageController : PageController<StoryPage>
{
[CustomContentOutputCache(Duration = 7200)]
public ActionResult Index(StoryPage currentPage)
{
return this.View(currentPage);
}
}
Now, open your browser and check in network tab if the current page Response Headers > Cache-Control value. If you have any active test running for current page then the value should be private otherwise public with max-age=7200 [value set by you for how long you want to cache].
Thanks and regards
Happy Coding
Comments