If we are using web services and SOA, then we can use IIS caching to cache our data values. Clearly this may not be appropriate for real-time data, but even a 60 second cache can increase performance without seriously impacting decision making. By decorating our web service like so, we can cache the data for 60 seconds.
<WebMethod(CacheDuration:=60)>
Here's an detailed article about caching in WCF.
Now we have moved a step up the application stack and are dealing with our domain objects. There are two places we can store cache data depending on their expected lifespan.If your page makes heavy use of certain objects, then discards them, you should consider storing the item in the HttpContext.Items collection. Items stored here have a lifespan of 1 request/response cycle. After that they are discarded.
If our objects are expected to be longer-lived between requests in an application, then a better storage is in the HttpRuntime.Cache.Items collection.
There are drawbacks to this approach. When you are debugging, you need to add an additional step to determine if your page is being processed or server from the cache. Like all performance optimizations, this should be done last to keep your system easy and predictable.