【sp1234】的“如何看你的缓存是否有效?”

总有人问“如何提高页面生成速度”的问题。说实在,这类问题“不要其烦”,我反而很奇怪怎么会有那么多人不知道答案呢?想来想去,大概是因为缓存效果不容 易看到的原因,似乎到底有没有缓存在自己开发机器上总是需要一些想象力才能看清楚。这里我就给一个最简单的例子,其实网上也有很多“范例”。

假设我们在一个页面中有一个部分是显示网站地图的树状菜单,也就是一下两句话:

<asp:TreeView ID="TreeView1" runat="server" ShowLines="True" DataSourceID="SiteMapDataSourceForTreeView" />
<asp:SiteMapDataSource ID="SiteMapDataSourceForTreeView" runat="server" />

并且假设还要在网页产生时(例如PreRender事件中)删除一些树节点。例如我就觉得使用roleprovider是对我已经有的系统复杂化,我只使 用login控件,我的每一个用户都有多个role,因此roleprovider并不适合我。我在上面这个TReeView1显示时就必须看一下 Nodes和ChildNodes,看看节点的 NavigateUrl 是不是当前登录的用户的role所支持的。

此时,我们不需要每当页面回发就重新创建TreeView1,更不希望总是重复这个删除节点过程。那么就需要将这两条代码“片段缓存”起来。

我们首先需要把这两条代码移到一个用户控件中,主页面使用这个用户控件。这仅需要半分钟。不错,vs可以在主页面设计时即时显示用户控件的图像。然后,我们要加上一个测试控件,就是在上面两个代码后边加上一条语句:

<asp:Label ID="TestLabel" runat="server" EnableViewState="False"> </asp:Label>

注意,这个Label是禁止ViewState的!在刷新是它总是丢弃原来的Text(实际上丢弃了运行时设置的一切状态)。

接下来,我们要验证我们的TreeView何时刷新。选择TreeView1控件,在属性窗口中点击事件 OnDataBound,然后添加一行代码:

     TestLabel.Text = DateTime.Now.ToLongTimeString();

然后就可以按“F5”运行。可以看到,当主页面回发时(例如按一个Button时),TestLabel中打印出不同的值,说明OnDataBound在此时执行了。

我们不希望它这么频繁地执行,而仅仅希望在用户注册码(保存在名为passport的cookie中)改变时才执行,也就是片段缓存整个用户控件。我们可以为用户控件第二行添加上:

<%@ OutputCache Duration="600" VaryByParam="none" VaryByCustom="cao" Shared="true" %>

这会缓存10分钟!

接下来,在global.ascx中添加代码来控制缓存刷新:

    public override string GetVaryByCustomString(HttpContext context, string custom)
    {
        if (custom == "cao" && context.Request.Cookies["passport"] != null)
            return context.Request.Cookies["passport"].Value;

        return base.GetVaryByCustomString(context, custom);
   }

再次按“F5”运行,就可以看到TestLabel证明绑定TreeView没有被绑定,直到我们的网页上更新了这个cookie值时才重新绑定!


缓存应该用在asp.net网站的方方面面。例如使用ObjectDataSource、SqlDataSource控件等来缓存大量查询数据,以及使用 OutputCache来缓存页面内容。总之,要尽量使用asp.net现成的工具来实现网站,尽量少地手工写代码,才能为快速优化网站打下基础。每一个 asp.net工具已经完成的事情都自己写代码去完成,虽然能够去学习asp.net的某些机制,也让你忽略了asp.net的某些高级的机制。如果你觉 得asp.net不够高级,继承它的组件然后扩展它,不要轻易地“从底层开发”与之功能类似的组件。

posted on 2008-04-30 16:03 virus 阅读(134) 评论(0)  编辑 收藏 所属分类: ASP.NET 2.0

<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

导航

统计

公告

大家快乐就好,可不要因为工作累坏身体啊,身体是工作的本钱啊!
任何一个傻瓜都能写出计算机可以理解的程序,只有写出人类容易理解的程序才是优秀的程序员。
我的MSN:jorden008@hotmail.com

与我联系

搜索

 

常用链接

留言簿(9)

我参与的团队

我的标签

随笔分类(132)

随笔档案(149)

文章分类(27)

收藏夹(1)

.NET 2.0 Dispose

.NET 2.0 Socket

.NET WinForm控件开发

.NET 加密解密

.NET 序列化

.NET 自定义异常

.NET安装部署

.NET技巧

.NET开源项目

.NET学习资源

ACM题库

ActiveX插件

ASP.NET 2.0

ASP.NET 2.0 Cache

ASP.NET 2.0 GridView

ASP.NET 2.0的用户密码加密(注册登录)

ASP.NET 3.5

ASP.NET AJAX

ASP.NET LINQ

ASP.NET MVC

ASP.NET Repeater

ASP.NET ViewState

ASP.NET Webservice

c# 3.0

c# Dllimport c++

c# ORM

c# WndProc

c# 面向接口设计

c#+winform自动升级

c#操作数据库

c#插件编程

c#事件委托

Castle

eclipse社区

Enterprise Library

ExtJS

j2ee struts2

java se6帮助

java 相关

javascript

java社区

MSN机器人开发

myeclipse6+hibernate

MySql

NHibernate

ObjectDataSource

OR-Mapping

Petshop 4.0

SharpDevelop

SQL Server 2005

TDD

VMWare

web.config

WEB控件开发

windows service

Windows Workflow

WinForm DataGridView技巧

WMI编程

XML

常用正则表达式

创业信息

弹出窗口

飞信

分词算法

国内牛人

国外牛人

前端界面开发

权限系统设计思路

设计模式

数据字典

系统定时运行,计划任务

下载好地方

友情链接

专业SVN托管服务

最新随笔

积分与排名

最新评论

阅读排行榜