电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> .NET
ASP.NET 2.0 中使用自定义缓存依赖-.NET教程,Asp.Net开发
作者:网友供稿 点击:3
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
 

在 asp.net 1.x 中,我们可以使用 cachedependency 来实现缓存依赖策略,但由于这个类是 sealed 的,我们无法继承这个类来实现我们自己的策略。但是到了 asp.net 2.0,我们已经可以从这个类派生出自己的缓存依赖类了。

假定我们要设计一个页面,需要从博客园首页获取最新的贴子信息。为了提高性能,我们希望页面数据仅当博客园首页有更新时才重新生成,否则的话就直接从缓存中获取。如何实现?

一、设计 blogcachedependency 类

先分析一下,首先,毫无疑问的,这个类应当从 cachedependency 派生出来,然后它才能在 cache 的 insert 方法中使用,或者被用在 aggregatedependency 类中。

其次,从博客园提供的 rss 以及页面设计的角度考虑,可以在缓存中放置 rss 数据,显示的时候使用一个样式转换。而在检查依赖性的时候,我们只需要简单地比较一下当前的 rss 与网站的 rss 是否相同就可以了。

一个比较重要的问题是:我们何时去检查比较 rss 数据?在每次请求的时候吗?显然不行,这样一来跟不使用缓存几乎没什么区别,甚至实际上加重了无谓的负担。考虑在没有请求的时候进行检查呢?我们可以使用一个 timer 来控制,让它定期去检查一个是否有更新,如果有更新则通知依赖发生了改变。

我们知道 cachedependency 类有一个 haschanged 属性,但是当 blogcachedependency 检查到依赖改变时如何告诉它的基类呢?这就是在 asp.net 2.0 中 cachedependency 类中新增的 notifydependencychanged 方法的使命了。

此外为了便于重用,blogcachedependency 类须得有一个 feed 数据,用来保存我们要获取的 rss 数据的 url。还要有一个时间间隔,便于在使用的时候调整刷新速度。

好,看看实际的实现代码:

 1public class blogcachedependency : cachedependency
 2{
 3    private timer _ticktimer;
 4    private int _timeinterval;
 5    private xpathnavigator _rss;
 6    private string _feed;
 7
 8    public xpathnavigator rss
 9    {
10        get
11        {
12            return _rss;
13        }
14    }
15
16    public blogcachedependency(string feed, int timeinterval)
17    {
18        _feed = feed;
19        _timeinterval = timeinterval;
20        _rss = getrss();
21        _ticktimer = new timer(new timercallback(checkdependencycallback),
22            this, _timeinterval * 1000, _timeinterval * 1000);
23    }
24
25    private xpathnavigator getrss()
26    {
27        xpathdocument rssdoc = new xpathdocument(_feed);
28        return rssdoc.createnavigator();
29    }
30
31    public void checkdependencycallback(object sender)
32    {
33        blogcachedependency bcd = sender as blogcachedependency;
34        xpathnavigator newrss = getrss();
35        if (newrss.outerxml != _rss.outerxml)
36        {
37            bcd.notifydependencychanged(bcd, eventargs.empty);
38        }
39    }
40
41    protected override void dependencydispose()
42    {
43        _ticktimer = null;
44        base.dependencydispose();
45    }
46}
47
48
这里,blogcachedependency 的构造函数中使用 _ticktimer 实现了一个定时检查更新的机制,它根据设定的时间间隔去调用 checkdependencycallback 方法。

而 checkdependencycallback 方法则将两个 rss 信息进行比较,如果不同,则调用 notifydependencychanged 方法通知基类,相应的缓存依赖已经发生了变化,缓存中的数据应当被清除。

二、页面设计

下面是页面代码(有删节),其中显示了 blogcachedependency 的使用方法:

 1<script runat="server">   
 2    protected void page_load(object sender, eventargs e)
 3    {
 4        string feed = "http://www.cnblogs.com/rss.aspx";
 5        if (cache[feed] == null)
 6        {
 7            blogcachedependency bcd = new blogcachedependency(feed, 600);
 8            cache.insert(feed, bcd.rss, bcd);
 9            label1.text = "当前数据为刚刚获取,并已更新入缓存!";
10        }
11        else
12        {
13            label1.text = "当前数据系从缓存中取得!";
14        }  
15        rssxml.xpathnavigator = cache[feed] as system.xml.xpath.xpathnavigator;
16        rssxml.transformsource = "translate.xsl";
17    }
18</script>
19
20<body>
21    <form id="form1" runat="server">
22       博客园最新贴子:
23       <br />
24       <asp:xml id="rssxml" runat="server" />
25       <br />
26       <asp:label id="label1" runat="server" forecolor="red" />
27 </form>
28</body>
29
本例中设定的访问博客园首页最新贴子列表,时间间隔为600秒,即每10分钟检查一次更新情况。

几个值得注意的地方:

1、注意使用的 rssxml.xpathnavigator 属性,有人可能奇怪为什么不用 rssxml.document 呢?实际上 document 属性在 .net 2.0 中已废除,推荐用来替代的是 xpathnavigator 属性,从前面的 blogcachedependency 类中可以看到,它是来源于 xpathdocument.createnavigator() 所创建的,从 msdn 我们可以知道,xpathdocument 类提供一种只读的快速缓存,显然就这个例子而言确实更加适合。

2、考虑一下,blogcachedependency 类中的 dependencydispose 方法作何用?它与 dispose 方法有何区别?让我们想一想,如果说某一次检查更新时,已经发现依赖变化了,但是却一直没有再次发送请求,那么这时会不会始终连续不断按间隔地执行 checkdependencycallback 方法呢?如果真的如此的话,那岂不是完全多余,因为只要查到一次有变化就不必再查了嘛。而如果我们进行跟踪或是记录日志的话可以发现,实际上只要查到依赖变化以后就不会再次 check 了。奥妙在哪里?想一想就能知道 notifydependencychanged 方法大有玄机,而且之所以会有 dependencydispose 方法的原因其实也就在这里。其中的设计思想,值得我们细细品味吧。

三、页面使用到的 translate.xsl

不再多说,贴出主要代码:

 1<xsl:template match="channel">
 2 <div>
 3  <xsl:for-each select="item">
 4   <a>
 5    <xsl:attribute name="href">
 6     <xsl:value-of select="link"/>
 7    </xsl:attribute>
 8    <xsl:value-of select="title"/>
 9   </a>
10   <br />   
11  </xsl:for-each>
12 </div>
13</xsl:template>
四、执行情况

这是最初执行的截图:

当博客园首页没有出现新贴子的时候,我们刷新页面,总是可以得到如下的页面:

而一旦有了新贴子,那么刷新的时候出现的是上一张图。

五、你想再高级一点吗?

如果你和我一样懒或是比我更懒,那么你可以考虑再用 javascript 写一个自动刷新页面的小功能,再把页面美工一下,或是包装成一个可复用的组件用在你的网站上,又或者只是想在本机里做一个“我最关注的内容集”之类的东西?嗯,想来效果会比较不错的哦。


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·经典收藏之 - C++内存管理详解-.NET教程,C#语言
·Master Page 初探-.NET教程,评论及其它
·GDI+编程10个基本技巧-.NET教程,评论及其它
·VB.NET中让Textbox只能输入数字(二)-.NET教程,VB.Net语言
·stl应用小问题-.NET教程,评论及其它
·WIN32中颜色值(COLORREF)与.NET中颜色值(Color)的转换-ASP教程,系统相关
·打造自己的专业图像工具-Visual C++ 2005图像编程系列【三】-.NET教程,C#语言
·.Net中常见问题及解决方法归类-.NET教程,.NET Framework
·Lex和Yacc从入门到精通(3)--一个极其简单的lex和yacc程序-.NET教程,评论及其它
·VB下几个非常有用的函数-.NET教程,VB.Net语言

最新文章
·VC#初学入门:第一个Windows程序
·ASP.NET 2.0-选用DataSet或DataReader
·用.net 处理xmlHttp发送异步请求
·asp.net创建文件夹的IO类的问题
·asp.net 2.0 中加密web.config 文件中的配置节
·关于ASP.NET调用JavaScript的实现
·如何实现ASP.NET网站个性化
·Acegi安全系统的配置-.NET教程,评论及其它
·Spring安全系统:Acegi Security Acegi简介-.NET教程,评论及其它
·Biztalk 开发之 架构和实例的验证-.NET教程,评论及其它


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号