Now I use what Steve Sanderson has done on his blog , and this is very nice:
public class ActionOutputCacheAttribute : ActionFilterAttribute { // This hack is optional; I'll explain it later in the blog post private static readonly MethodInfo _switchWriterMethod = typeof (HttpResponse).GetMethod("SwitchWriter", BindingFlags.Instance | BindingFlags.NonPublic); private readonly int _cacheDuration; private string _cacheKey; private TextWriter _originalWriter; public ActionOutputCacheAttribute(int cacheDuration) { _cacheDuration = cacheDuration; } public override void OnActionExecuting(ActionExecutingContext filterContext) { _cacheKey = ComputeCacheKey(filterContext); var cachedOutput = (string) filterContext.HttpContext.Cache[_cacheKey]; if (cachedOutput != null) filterContext.Result = new ContentResult {Content = cachedOutput}; else _originalWriter = (TextWriter) _switchWriterMethod.Invoke(HttpContext.Current.Response, new object[] {new HtmlTextWriter(new StringWriter())}); } public override void OnResultExecuted(ResultExecutedContext filterContext) { if (_originalWriter != null) // Must complete the caching { var cacheWriter = (HtmlTextWriter) _switchWriterMethod.Invoke(HttpContext.Current.Response, new object[] {_originalWriter}); string textWritten = (cacheWriter.InnerWriter).ToString(); filterContext.HttpContext.Response.Write(textWritten); filterContext.HttpContext.Cache.Add(_cacheKey, textWritten, null, DateTime.Now.AddSeconds(_cacheDuration), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); } } private string ComputeCacheKey(ActionExecutingContext filterContext) { var keyBuilder = new StringBuilder(); foreach (var pair in filterContext.RouteData.Values) keyBuilder.AppendFormat("rd{0}_{1}_", pair.Key.GetHashCode(), pair.Value.GetHashCode()); foreach (var pair in filterContext.ActionParameters) keyBuilder.AppendFormat("ap{0}_{1}_", pair.Key.GetHashCode(), pair.Value.GetHashCode()); return keyBuilder.ToString(); } }
For more information, visit Steve Sanderson's blog article .
Wahid bar
source share