Output Caching Actions Gotcha in ASP.NET MVC 3
Posted by: Malcolm Sheridan ,
on 3/7/2011,
in
Category ASP.NET MVC
Abstract: The following goes through describes how to avoid the output caching problem in ASP.NET MVC 3.
This is a gotcha I had to write about. Everyone knows the benefits of caching data when working with the web. Be it file caching, donut caching or SQL Server caching, the benefits are obvious; retrieving data from memory instead of a data store means a more performance. I recently had an action that was being used frequently, so I decided to cache the action. I was trying to use a cache profile for this. I’ve used them previously in ASP.NET and the benefits of using them are incontrovertible. Moving configurable code into the web.config just makes sense.
I’ll change the real code I was using to something simple, so the action method looked like this.

And if I called that action with the following code, things worked as expected.

Now if you try to code according to better coding practices, you’d move the caching code into a cache profile. So here’s the cache profile in web.config.

Next is to update the action to use the cache profile.

Now if you run the website, you’ll encounter the Yellow Screen of Death.

Duration must be a positive number. I doubled checked the web.config to make sure I add this value, and yes I did. After much stumbling around, I peeked inside of the MVC 3 source code and looked at the OutputCacheAttribute class and found the ValidateChildActionConfiguration method.

This method is called during the OnActionExecuting event.

ValidateChildActionConfiguration throws an error if you don’t have the Duration and VaryByParam values set.
What’s the way around this? Well you can either stick to hard coding the values in the OutputCache attribute. There’s nothing wrong with that. Another option is to implement your own cache attribute. You can implement this in ASP.NET 4.0 if you create your own OutputCacheProvider object. Personally having to do this myself makes me reluctant as this is plumbing code, and I expect that it should be dealt with by the framework.
The entire source code of this article can be downloaded over here
This article has been editorially reviewed by Suprotim Agarwal.
C# and .NET have been around for a very long time, but their constant growth means there’s always more to learn.
We at DotNetCurry are very excited to announce The Absolutely Awesome Book on C# and .NET. This is a 500 pages concise technical eBook available in PDF, ePub (iPad), and Mobi (Kindle).
Organized around concepts, this Book aims to provide a concise, yet solid foundation in C# and .NET, covering C# 6.0, C# 7.0 and .NET Core, with chapters on the latest .NET Core 3.0, .NET Standard and C# 8.0 (final release) too. Use these concepts to deepen your existing knowledge of C# and .NET, to have a solid grasp of the latest in C# and .NET OR to crack your next .NET Interview.
Click here to Explore the Table of Contents or Download Sample Chapters!
Was this article worth reading? Share it with fellow developers too. Thanks!
Malcolm Sheridan is a Microsoft awarded MVP in ASP.NET, a Telerik Insider and a regular presenter at conferences and user groups throughout Australia and New Zealand. Being an ASP.NET guy, his focus is on web technologies and has been for the past 10 years. He loves working with ASP.NET MVC these days and also loves getting his hands dirty with jQuery and JavaScript. He also writes technical articles on ASP.NET for SitePoint and other various websites. Follow him on twitter @
malcolmsheridan