【转】系统缓存全解析二:动态缓存(2)-页面局部缓存的两种方式


有时缓存整个页面是不现实的,因为页的某些部分可能在每次请求时都需要变化。在这些情况下,只能缓存页的一部分。顾名思义,页面部分缓存是将页面部分内容保存在内存中以便响应用户请求,而页面其他部分内容则为动态内容。页面部分缓存的实现包括两种方式:

    控件缓存(通过使用控件嵌套的方式来实现缓存部分页面) 。


    替换后缓存(通过缓存整个页面,替换部分页面组件的方式来实现部分缓存)。


1. 控件缓存(也称为片段缓存):


这种方式允许将需要缓存的信息包含在一个用户控件内,然后,将该用户控件标记为可缓存的,以此来缓存页面输出的部分内容。该选项允许缓存页面中的特定内容,而没有缓存整个页面,因此,每次都需重新创建整个页。例如,如果要创建一个显示大量动态内容(如股票信息)的页,其中有些部分为静态内容(如每周总结),这时可以将静态部分放在用户控件中,并允许缓存这些内容。

在ASP.NET中,提供了UserControl这种用户控件的功能。一个页面可以通过多个UserControl来组成。只需要在某个或某几个UserControl里设置缓存。

例如:

那么可以在WebUserControl1.ascx的页头代码中添加声明语句:

<%@
Control Language="C#" AutoEventWireup="true"
CodeBehind="WebUserControl1.ascx.cs"
Inherits="CacheWebApp._16_4_5.WebUserControl1" %>

<%@ OutputCache  Duration="60" VaryByParam="none" %>

<%=DateTime.Now %>


调用该控件的页面WebForm1.aspx代码:

<%@ Page Language="C#"
AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs"
Inherits="CacheWebApp._16_4_5.WebForm1" %>

<%@ Register
src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1"
%>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head
runat="server">

<title>控件缓存</title>

</head>

<body>

<form
id="form1" runat="server">

<div>

页面的:<%=DateTime.Now
%>

</div>

<div>

控件的:<uc1:WebUserControl1
ID="WebUserControl11" runat="server"
/>

</div>

</form>

</body>

</html>



这时候刷新WebForm1.aspx页面时,页面的时间每次刷新都变化,而用户控件中的时间数据却是60秒才变化一次,说明对页面的“局部”控件实现了缓存,而整个页面不受影响。


-------------------------------------------------------------------------------------------------------


2. 缓存后替换:


与控件缓存正好相反。它对整个页面进行缓存,但是页中的某些片段是动态的,因此不会缓存这些片段。ASP.NET页面中既包含静态内容,又包含基于数据库数据的动态内容。静态内容通常不会发生变化。因此,对静态内容实现数据缓存是非常必要的。然而,那些基于数据的动态内容,则不同。数据库中的数据可能每时每刻都发生变化,因此,如果对动态内容也实现缓存,可能造成数据不能及时更新的问题。对此问题如果使用前文所述的控件缓存方法,显然不切实际,而且实现起来很繁琐,易于发生错误。

如何实现缓存页面的大部分内容,而不缓存页面中的局部某些片段。ASP.NET
2.0提供了缓存后替换功能。实现该项功能可通过以下三种方法:

一是以声明方式使用Substitution控件,

二是以编程方式使用Substitution控件API,

三是以隐式方式使用控件。

前两种方法的核心是Substitution控件,本节将重点介绍该控件,第三种方法仅专注于控件内置支持的缓存后替换功能,本节仅做简要说明。



(1)
Substitution控件应用

为提高应用程序性能,可能会缓存整个ASP.NET页面,同时,可能需要根据每个请求来更新页面上特定的部分。例如,可能要缓存页面的很大一部分,需要动态更新该页上与时间或者用户高度相关的信息。在这种情况下,推荐使用Substitution控件。Substitution控件能够指定页面输出缓存中需要以动态内容替换该控件的部分,即允许对整页面进行输出缓存,然后,使用Substitution控件指定页中免于缓存的部分。需要缓存的区域只执行一次,然后从缓存读取,直至该缓存项到期或被清除。动态区域,也就是Substitution控件指定的部分,在每次请求页面时都执行。Substitution控件提供了一种缓存部分页面的简化解决方案。

<%@
Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs"
Inherits="CacheWebApp._16_4_5.WebForm2" %>

<%@ OutputCache
Duration="60" VaryByParam="none" %>

<html
xmlns="http://www.w3.org/1999/xhtml" >

<head
runat="server">

<title>缓存后替换示例</title>

</head>

<body>

<form
id="form1" runat="server">

<div>

页面缓存的时间:<%=
DateTime.Now.ToString() %>

</div>

<div>


真实(替换)的时间:<asp:Substitution ID="Substitution1" runat="server"
MethodName="getCurrentTime"
/>

</div>

</form>

</body>

</html>
页面后台代码:

public
partial class WebForm2 : System.Web.UI.Page

{

public static string
getCurrentTime(HttpContext context)

{

return
DateTime.Now.ToString();

}

}
如上代码所示,Substitution控件有一个重要属性:MethodName。该属性用于获取或者设置当Substitution控件执行时为回调而调用的方法名称。该方法比较特殊,必须符合以下3条标准:

Ø
此方法必须被定义为静态方法;

Ø 此方法必须接受HttpContext类型的参数;

Ø
此方法必须返回String类型的值。



在运行情况下,Substitution控件将自动调用MethodName属性所定义的方法。该方法返回的字符串即为要在页面中的Substitution控件的位置上显示的内容。如果页面设置了缓存全部输出,那么在第一次请求时,该页将运行并缓存其输出。对于后续的请求,将通过缓存来完成,该页上的其他代码不会再运行。但Substitution控件及其有关方法则在每次请求时都执行,并且自动更新该控件所表示的动态内容,这样就实现了整体缓存,局部变化的替换效果。



如上代码所示,在代码头部通过@
OutputCache指令设置页面输出缓存过期时间为5秒,这意味着整个页面数据都应用了缓存功能。因此,“页面缓存的时间”所显示的时间值来自于数据缓存。这个时间值不会随着刷新页面而变化,仅当缓存过期时才会发生更新。Substitution控件的MethodName属性值为getCurrentTime。该控件显示的内容来自于getCurrentTime方法的返回值。尤为重要的是,虽然页面设置了输出缓存功能,但是每当页面刷新时,ASP.NET执行引擎仍然要重新执行Substitution控件,并将MethodName属性值指定的方法返回值显示在页面上,因此,显示的是当前最新时间。

示例效果,如图15-2所示:



图15-2
缓存后替换

随着页面的刷新,真实时间在变,而页面缓存的时间在指定的缓存时间内始终不变。




注意:

l
Substitution控件无法访问页上的其他控件,也就是说,无法检查或更改其他控件的值。但是,代码确实可以使用传递给它的参数来访问当前页上下文。

l
在缓存页包含的用户控件中可以包含Substitution控件。但是,在输出缓存用户控件中不能放置Substitution控件。

l
Substitution控件不会呈现任何标记,其位置所显示内容完全取决于所定义方法的返回字符串。




(2)
Substitution控件API应用

上一小节介绍了以声明方式使用Substitution控件实现缓存后替换的应用。本节说明另一种实现方法。该方法的核心是以编程方式利用Substitution控件API实现缓存后替换,相对于以声明方式使用Substitution控件的方法具有更强灵活性。

通过为Substitution指定回调方法,实现和声明同样的效果。Substitution的回调方法必须是

HttpResponseSubstitutionCallback委托定义的方法,它有两个特征:

l
一是返回值必须是String,

l
二是参数有且仅有一个,并且是HttpContext类型。

当需要以编程方式,为缓存的输出响应动态生成指定的响应区域时,可以在页面代码中将某个方法(即回调方法)的名称作为参数(HttpResponseSubstitutionCallback)传递给Substitution。这样Substitution就能够使用回调方法,并将回调方法的返回值作为给定位置的替代内容显示出来。

需要注意的是,回调方法必须是线程安全的,可以是作为容器的页面或者用户控件中的静态方法,也可以是其他任意对象上的静态方法或实例方法。



下面演示一个以编程方式将
Substitution
控件添加到输出缓存网页。与(1)Substitution控件应用所示的示例完成同样功能。不同的是实现方式。



<%@
Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs"
Inherits="CacheWebApp._16_4_5.WebForm3" %>

<%@ OutputCache
Duration="60" VaryByParam="none" %>

<html
xmlns="http://www.w3.org/1999/xhtml">

<head
runat="server">

<title>缓存后替换-Substitution控件API应用</title>

</head>

<body>

<form
id="form1" runat="server">

<div>

页面缓存的时间:<asp:Label
ID="Label1" runat="server"
Text="Label"></asp:Label>

</div>

<div>

真实(缓存替换)的时间:

<asp:PlaceHolder
ID="PlaceHolder1"
runat="Server"></asp:PlaceHolder>

</div>

</form>

</body>

</html>





页面后台CS代码:


protected void Page_Load(object sender, EventArgs
e)

{

//创建一个Substitution

Substitution Substitution1 = new
Substitution();

//指定调用的回调方法名

Substitution1.MethodName =
"GetCurrentDateTime";

PlaceHolder1.Controls.Add(Substitution1);




Label1.Text=DateTime.Now.ToString();

}

public
static string GetCurrentDateTime(HttpContext context)

{

return
DateTime.Now.ToString();

}
如上代码所示,页面使用@
OutputCache指令设置了输出缓存功能,其配置数据缓存过期时间为60秒。然而,页面其他内容都被缓存,通过Substitution调用的回调方法显示的内容是不被缓存的。

 

引用地址:http://hi.baidu.com/jiangyangw3r/item/e2cad6d0a9eb2ee6b2f77769

转载于:https://www.cnblogs.com/sishierfei/archive/2012/07/13/2590513.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP心跳机制

所谓的心跳包就是客户端定时放送简单的信息给服务器端&#xff0c;告诉它我还在而已。代码就是每隔几分钟发送一个固定信息给服务器端&#xff0c;服务器端回复一个固定信息。如果服务器端几分钟后没有收到客户端信息则视客户端断开。比如有些通信软件长时间不适用&#xff0c;…

A20成功驱动FT5206触摸屏

经过三个晚上的奋斗&#xff0c;终于在A20上驱动了FT5206触摸屏。实现过程有限蹊跷&#xff0c;现在暂时将实现过程记录下来以免遗忘。 FT5206的驱动在bsp里已经以ko文件的形式提供了&#xff0c;只要在sun7i.init.rc这个系统初始化脚本里加上insmod ft5x_ts.ko即可在系统启动时…

ibatis的简介与初步搭建应用

一、ibatis的简介 ibatis是什么东西就不介绍了&#xff0c;自己去找谷老师。 这里讲下自己的使用体会。之前自己学过Hibernate&#xff0c;是看尚学堂的视频教学的&#xff0c;看完以后发现Hibernate体系中的内容真的很多&#xff0c;什么N-N关联、HSQL、缓存管理等等&#xff…

html中页面按钮隐藏div,html 点击一个按钮 显示另一个div 隐藏之前呢个div(display属性,怎么用js控制)...

用户提问隐藏这个显示这个烦烦烦&#xff1a;嘎嘎嘎 推荐答案function tab(name,cursel,n){for(i1;i<n;i){var condocument.getElementById(name"_"i);var con1document.getElementById(name"_"i"_"i);con.style.blockicursel?"display…

You must install 'makeinfo' on your build machine

ubuntu&#xff1a;sudo apt-get install texinfo 就OK 今天在打包的时候有个包需要 makeinfo 当时就各种搜结果就没有 makeinfo 这个软件包&#xff0c;最后看到有人说其实就是 texinfo 这个包&#xff0c;经过测试&#xff0c;不管是ubuntu 还是qomo &#xff08;yum 源&a…

[0716] Jsoi B Rsss

rsss 时间限制:1秒 内存限制: 128 MB 试题描述 在质数的大家庭中&#xff0c;大小之差不超过2的两个质数称它俩为一对孪生素数&#xff0c;如2和3、3和5、17和19等等。请你统计一下&#xff0c;在不大于自然数N的质数中&#xff0c;孪生素数的对数。 输入要求 输入文件rsss.in…

asp页面怎么转html页面,将asp页面转换成html页面 代码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼将asp页面转换成html页面Sub GenFile(id)dim objXmlHttpset objXmlHttp Server.CreateObject("Microsoft.XMLHTTP")objXmlHttp.open "GET","http://www.xxx.com/product.asp?id" & id ,falseo…

You must install 'msgfmt' on your build machine

ubuntu&#xff1a;sudo apt-get install gettext 就OK

HDOJ 1875 畅通工程再续

这个畅通工程还是一交就过&#xff0c;看来畅通工程用来入门是最好了&#xff0c;以后拿这些来挂就不会那么打击人了&#xff0c;天天开心。这里求最小生成树之前要自己构图&#xff0c;很简单就是求出点到点之间的距离&#xff0c;如果距离大于1000和小于10都视作不连通。点少…

ISDN与PSTN的区别是什么?

ISDN是综合业务数字网的简称&#xff0c;它由电话综合数字网&#xff08;IDN&#xff09;发展而来。ISDN是数字交换和数字传输的结合&#xff0c;它以迅速、准确、经济、有效的方式提供目前各种通信网络中现有的业务&#xff0c;而且将通信和数据处理结合起来&#xff0c;开创了…

html5 audio 获取播放时间,html5 audio 延时获取播放路径播放失败

为什么audio对象在延时1000毫秒之后就不能执行播放呢?歌曲的路径需要从数据库中获取&#xff0c;所以需要用ajax来交互&#xff0c;但是发现假如时间过长即使获取到路径也不能执行播放。为方便测试使用setTimeout来模拟自动播放音乐测试试试看能不能听到声音。(function () {v…

VOIP,PSTN,ISDN

近来在电视、杂志特集等展露头脚的「IP电话」&#xff0c;因其通话费用低廉而有口皆碑。IP电话利用的IP网络在互联网的世界里是众所周知的。互联网被认为基本上是免费的网络。接下来以此开放的技术和构想作为基础而登场的就是IP电话。IP电话与构成 所谓的IP电话 所谓的IP电话就…

2021高考成绩查询时间福州,福州2021高考填志愿入口

高考结束后学校和专业如何选择2021-06-07 20:19:16文/杨婷现在很多考生高考结束之后&#xff0c;不知道怎么选择学校和专业&#xff0c;下面小编为大家整理了相关内容&#xff0c;以供参考&#xff0c;一起来看看&#xff01;高考结束后学校和专业如何选择一、根据孩子兴趣来进…

svn在linux下的使用(svn命令行)ubuntu 删除 新增 添加 提交 状态查询 恢复

合并步骤&#xff1a;&#xff08;1&#xff09;先切换到分支&#xff1b;&#xff08;2&#xff09;svn merge trunk . &#xff08;3&#xff09;svn sw trunk &#xff08;4&#xff09;svn merge --reintegrate branch . svn merge http://59.251.189.152:8989/svn/ron/tru…

关于关闭office 2010中的OSPPSVC服务的方法

今天重装了系统,并安装了office 2010 VOL版,结果发现在使用word、Excel等程序时&#xff0c;系统同时打开了一个OSPPSVC的进程(是一个服务)&#xff0c;但是在word等程序关闭后,该进程不能关闭&#xff0c;仍在后台运行&#xff0c;让人感觉不舒服。通过查找发现&#xff1a; 文…

计算机组装与维护模拟测试题三答案,春季高考信息技术模拟题3(计算机组装与维修部分含答案)...

36.计算机硬件系统的核心部件是A&#xff0e;主板B&#xff0e;CPUC&#xff0e;内存D&#xff0e;硬盘 37.北桥芯片的功能不包括A&#xff0e;对CPU类型和主频的支持B&#xff0e;对ECC纠错的支持C&#xff0e;对内存类型和最大容量的支持D&#xff0e;对USB接口的支持 38.操作…

【原创】SqlServer 2005 BCP命令详解

一、命令详解 1.  将远程数据库数据导出到本地文件 EXEC master..xp_cmdshell bcp "sql查询语句" queryout 本地文件路径 -t"," -c -S服务器ip -U"用户名" -P"密码" 注意&#xff1a;在本机上执行的命令最终文件未必备份到本机&…

wince6下usb摄像头(UVC)使用指南

转自&#xff1a;http://hi.baidu.com/cahbb/blog/item/6d76093498fe0790a61e120e.html 在搭好了wince6的开发环境之后&#xff0c;下一步试验一下wince6下使用摄像头的方法。搜集了不少资料&#xff0c;从中学习了很多有用的东西&#xff0c;在这给记录下来&#xff0c;方便…

如何用计算机绘图画图,2018年《计算机绘图》考试试题及答案【完整版】.doc

2018年《计算机绘图》试题及答案【完整版】一、填空题1、CAD的常用图形输入设备有 、数字化仪、图形输入板、光笔、 等。鼠标键盘2、CAD系统的显示器有阴极射线管显示器、 显示器和等离子显示器。液晶显示器3、CAD的软件可分为 软件、支撑软件和 软件三个层次。系统软件、应用软…

使用SqlCommandBuilder

使用命令构造器添加行 View Code using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient;namespace PersistAddsBuilder {class Program{static void Main(string[] args){string connStri…