就像使用ASP.NET开发Web Services一样,我们可以使用相同的方法来让ASP.NET为相同资源并且有相同参数的请求缓存输出,而我们只需要设置WebMethodAttribute的CacheDuration属性即可。在上面的代码片断中,方法的结果会被调用10秒钟。我们可以从System.Web.Extenssions.dll中System.Web.Script.Services.RestHandler类的InitializeCachePolicy静态方法中得知到底发生了什么事情:
|
当ASP.NET AJAX发现即将执行的方法被设置了CacheDuration时,它会将HttpCacheability.Server作为参数调用当前上下文中HttpCachePolicy的SetCacheability方法,这样请求的结果将会被缓存以便将来使用。如果将要执行的方法含有参数,那么通过VaryByParams属性从HttpCachePolicy中得到的HttpCacheVaryByParams对象里“*”这一项将被设为true,由此可知,ASP.NET会为不同的参数组合缓存不同的结果。
我们来看一下缓存的效果:

图2
与通过自己编程来缓存数据相比,设置CacheDuration属性来缓存结果的最大优势就在于使用方式是在简单。现在我们就可以将注意力完全放在方法的自身实现上而不用处理缓存中会出现的问题(例如:同步问题)。这个方法也提高了少许性能,因为现在已经无需将结果序列化成JSON对象了,ASP.NET将全权负责将缓存的数据发送到各客户端。但是在某些时候由我们来缓存数据会更合适一些,因为这样可以省下服务器端的资源。例如,以下是一个接受四个参数的方法,其中第二个参数表示是否应该将剩下的两个参数忽略:
public string GetResult(int key, bool ignoreRest, string args1, string args2) { ... } |
在这种情况下,几乎所有的程序员都会在ignoreRest参数为true的情况下仅仅根据key参数的不同值来缓存数据。但是ASP.NET无法得知参数的含义,因此它会为所有的参数组合形式各缓存一份数据,而不去关心它们是否相同。
客户端缓存
我使用HttpWatch Basic Edition来捕获客户端和服务器端之间的通信。这是捕获结果的截图:

图3
每当我们访问Script Method时,相同的内容会被POST到服务器端,并且得到相同的结果。尽管结果被缓存了,我们只是节省了方法的执行时间,但是round-trip的数量依旧没有减少。这意味着如果结果的数据量很大,或者带宽很窄,对用户来说访问Script Method依旧是个耗时的过程。因此如果我们能够在客户端缓存结果的话,用户使用相同参数访问方法时就可以立即得到数据,即使在网络中端的情况下。
相关专题
- Ajax技术专题 (563篇文章)
- .NET移动与嵌入式技术 (6036篇文章)
- .NET开发手册 (5726篇文章)
- Ajax技术应用开发 (563篇文章)
- ASP.NET教程 (8548篇文章)
- .NET实用开发 (1699篇文章)
- JAVA和.Net开发 (108篇文章)
- ASP.NET应用篇 (2674篇文章)
- Ajax标签导航实例详解 (73次浏览)
- 用Visual Studio.NET 2008实现Ajax+WCF Servi (46次浏览)
- Ajax 的六个误区 (24次浏览)
- 高级:使用异步Servlet扩展AJAX应用程序 (17次浏览)
- 使用ASP.NET AJAX访问Script Method时启用客户 (8次浏览)
- 分清ASP.NET AJAX中的Extender和Behavior模型 (7次浏览)
- MS AJAX类库回调函数不使用window.open() (4次浏览)
- 快速简便的使用AJAX技术操作的介绍 (0次浏览)



