在asp.net仲使用output cache 非常简单。只需在页面或者自定义控件上声明,即可以控制页面或者控件的缓存策略。
例如:
1 <%@ OutputCache Duration ="10" VaryByParam="*" %>
这样就声明了一个页面的缓存策略。缓存的存续时间为10秒,任何通过GET或者POST方式传递到页面的参数都会使页面的输出缓存失效。
页面outputcache指令的具体参数在MSDN上有详细说明,在此就不赘述了。
使用输出缓存应注意以下:
asp.net页面在缓存生成以后,失效之前,所有对该页面的请求,直接从内存中取出并送显,将不会经历asp.net的页面生命周期。也就是说在页面声明周期内的各种事件内的代码,将不会被执行。
往往页面不能够整体被缓存,有些部门需要及时更新,这就需要部分页缓存或者缓存后替换。
部分页缓存
为自定义控件声明缓存,页面中调用该控件,控件将会缓存,其余部分不被缓存。
被缓存后的控件一样不经历生命周期,将不能和页面交互。
缓存后替换
MSDN给出三种缓存后替换方案:
1. Substitution控件实现缓存后替换
<asp:Substitution ID="Substitution1" runat="server" MethodName="GetDate" />
代码:
protected static string GetDate(HttpContext context)
{
return "<b>" + DateTime.Now + "</b>";
}
注意:(1)substitution控件的MethodName属性所指定的方法必须为静态方法并具有HttpContext类型参数。
(2)在上例中的GetDate方法中,因为没有经历页面的生命周期,在方法体内Request、Session、Cookies等等页面属性都是不可用的。
2.Response.WriteSubstitution 方法
Response.WriteSubstitution(new HttpResponseSubstitutionCallback(GetDate));
GetDate方法同上。
3. AdRotator控件
Adrotator服务器控件在内部实现对缓存后替换的支持
另外在使用时我发现一种比较另类的缓存后替换,比较适合于懒人。那就是用iframe,在iframe内存放动态更新的内容。
如果页面大面积需要缓存,而只有一小块不能缓存,而且这一块的动态更新需要依赖Page属性(比如Session)或者控件的值,可以考虑iframe。
最后,在使用中发现这样一个问题。asp.net会缓存两个版本:一个是首次打开时被缓存的版本,一个页面建立缓存之后第一次postback的版本。
也就是说在页面被缓存之后,第一次postback会执行页面的生命周期。以后的请求,如果是首次请求则送显首次打开的缓存版本,如果是postback则送显第一次postback时的缓存版本。不清楚为什么会是这样?为什么页面被缓存之后,第一次postback还会起作用?还请各位大侠点拨。