[转载]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;
}
Mikel