Working with the Output Cache and other Action Filters

The OutputCacheAttribute has limitations by the way and there is a custom attribute named DonutOutputCache developed by Paul Hiles helps to overcome the limitations.

One of the important feature it supports is you can have an action filter that can be called all the times even the action is marked with cache attribute or not.

For ex. you want to cache an action for the duration 5 seconds and at the same time you want to log every time the action receives a request using a LogThis filter you can achieve that simply by below,

[LogThis]
[DonutOutputCache(Duration=5, Order=100)]
public ActionResult Index()

From Paul,

Yes, unlike the built-in OutputCacheAttribute, the action filters will
execute even when a page is retrieved from the cache. The only caveat
to add is that you do need to be careful about the filter order. If
your action filter implements OnResultExecuting or OnResultExecuted
then these methods will be executed in all cases, but for
OnActionExecuting and OnActionExecuted, they will only be executed if
the filter runs before the DonutOutputCacheAttribute. This is due to
the way that MVC prevents subsequent filters from executing when you
set the filterContext.Result property which is what we need to do for
output caching.

I do not think that you can rely on the order in which action filters
are defined on an action or controller. To ensure that one filter runs
before another, you can make use of the Order property that is present
on all ActionFilterAttribute implementations. Any actions without the
order property set, default to an value of -1, meaning that they will
execute before filters which have an explicit Order value.

Therefore, in your case, you can just add Order=100 to the
DonutOutputCache attribute and all other filters will execute before
the caching filter.

Leave a Comment