[转载]ASP.NET MVC 1.0,静态化缓存 和 OutputCache – 天空站长教程网 | 天空站长学编程,学习,考试,认证的最佳网站 – www.qzsou.cn.
静态化缓存 和 OutputCache 不同,它适用于那些有大量可访问页面(的)网站(比如新闻站点)。要知道我们(的)网站每天都会被(很)多智商不高(的)傻蜘蛛和灌水机做全身检查,这些 家伙往往会深度遍历 n 多(的)页面,(很)容易导致我们有限(的) “动态缓存” 被频繁刷新,失去了缓存应有(的)价值。还有一点,静态缓存往往独立存储,可以(是)多台 Memchaced 或者 DFS 系统,如此在一个负载均衡环境里,这种跨进程和机器(的)缓存模式会更有效。
我们首先定义一个缓存接口,以便日后可以实现多种缓存策略。
public interface IStaticCache { void Set(string key, object value, DateTime absoluteExpiration); void Set(string key, object value, TimeSpan slidingExpiration); T Get<T>(string key); void Delete(string key); }
接下来,我们要拦截 ActionResult Render 输出,将其保存到缓存中,并在下一次访问时使用。原理(很)简单,(就是)调用 Response.SwitchWriter 更换输出器。
public sealed class HttpResponse { internal TextWriter SwitchWriter(TextWriter writer) { TextWriter writer2 = this._writer; this._writer = writer; return writer2; } }
虽然(是) internal,用反射还(是)(很)容易达成目(的)。
private TextWriter SwitchWriter(TextWriter writer) { var method = typeof(HttpResponse).GetMethod("SwitchWriter", BindingFlags.NonPublic | BindingFlags.Instance); return method.Invoke(HttpContext.Current.Response, new object[] { writer }) as TextWriter; }