使用ASP.NET AJAX访问Script Method时启用客户端缓存 1
点击次数:20 次 发布日期:2008-11-26 10:48:03 作者:源代码网
|
源代码网推荐 缓存是开发高性能和高可用性Web应用的重要手段之一。作为ASP.NET AJAX的关键功能,从客户端访问Script Method会被大量用于使用ASP.NET开发的AJAX应用。以下是这一功能最简单的例子。 源代码网推荐 源代码网推荐 <asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Debug"> 源代码网推荐 <Services> 源代码网推荐 <asp:ServiceReference Path="CacheService.asmx" /> 源代码网推荐 </Services> 源代码网推荐 </asp:ScriptManager> 源代码网推荐 源代码网推荐 <script language="javascript" type="text/javascript"> 源代码网推荐 var count = 0; 源代码网推荐 源代码网推荐 function getServerTime() 源代码网推荐 { 源代码网推荐 window.count ++; 源代码网推荐 CacheService.GetServerTime(onSucceeded); 源代码网推荐 } 源代码网推荐 源代码网推荐 function onSucceeded(result) 源代码网推荐 { 源代码网推荐 Sys.Debug.trace(result.format("HH:mm:ss")); 源代码网推荐 源代码网推荐 if (count < 6) 源代码网推荐 { 源代码网推荐 window.setTimeout(getServerTime, 3000); 源代码网推荐 } 源代码网推荐 else 源代码网推荐 { 源代码网推荐 window.count = 0; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 </script> 源代码网推荐 源代码网推荐 <input type="button" value="GetCurrentTime" onclick="getServerTime()" /> 源代码网推荐 <br /><br /> 源代码网推荐 源代码网推荐 <textarea cols="20" rows="10" id="TraceConsole"></textarea> 源代码网推荐 源代码网推荐 页面上有一个ScriptManager控件,其ScriptMode属性被设为Debug,这样我们就可以使用Sys.Debug.trace方法向ID为TraceConsole的TextArea元素中添加文本了。当点击页面上的按钮时,我们会连续访问6次服务器端的方法以获得服务器端的时间,每两次请求之间将会有一个3秒的间隔。服务器端的方法定义如下: 源代码网推荐 源代码网推荐 [ScriptService] 源代码网推荐 public class CacheService : System.Web.Services.WebService 源代码网推荐 { 源代码网推荐 [WebMethod] 源代码网推荐 public DateTime GetServerTime() 源代码网推荐 { 源代码网推荐 return DateTime.Now; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 打开页面,点击按钮,我们可以在页面中看到如下的结果: 源代码网推荐
源代码网推荐 服务器端缓存 源代码网推荐 在ASP.NET AJAX中访问Script Method的功能有一个内置的服务器端缓存能力,但是似乎很少有人用到它——它的确有一定的局限性。大部分的开发人员都会将数据存放到HttpContext.Cache对象或者其他一些地方,然后在需要时从缓存中重新获取对象。这是开发ASP.NET应用时最常用的缓存方式之一,但是我们有时可以用一种更加方便,更加有效的方法。请看下面的代码是如何打开这个功能的。 源代码网推荐 源代码网推荐 [WebMethod(CacheDuration=10)] 源代码网推荐 public DateTime GetServerTime() 源代码网推荐 { 源代码网推荐 return DateTime.Now; 源代码网推荐 } 源代码网推荐 源代码网推荐 就像使用ASP.NET开发Web Services一样,我们可以使用相同的方法来让ASP.NET为相同资源并且有相同参数的请求缓存输出,而我们只需要设置WebMethodAttribute的CacheDuration属性即可。在上面的代码片断中,方法的结果会被调用10秒钟。我们可以从System.Web.Extenssions.dll中System.Web.Script.Services.RestHandler类的InitializeCachePolicy静态方法中得知到底发生了什么事情: 源代码网推荐 源代码网推荐 private static void InitializeCachePolicy(WebServiceMethodData methodData, HttpContext context) 源代码网推荐 { 源代码网推荐 int cacheDuration = methodData.CacheDuration; 源代码网推荐 if (cacheDuration > 0) 源代码网推荐 { 源代码网推荐 context.Response.Cache.SetCacheability(HttpCacheability.Server); 源代码网推荐 context.Response.Cache.SetExpires(DateTime.Now.AddSeconds((double) cacheDuration)); 源代码网推荐 context.Response.Cache.SetSlidingExpiration(false); 源代码网推荐 context.Response.Cache.SetValidUntilExpires(true); 源代码网推荐 if (methodData.ParameterDatas.Count > 0) 源代码网推荐 { 源代码网推荐 context.Response.Cache.VaryByParams["*"] = true; 源代码网推荐 } 源代码网推荐 else 源代码网推荐 { 源代码网推荐 context.Response.Cache.VaryByParams.IgnoreParams = true; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 else 源代码网推荐 { 源代码网推荐 context.Response.Cache.SetNoServerCaching(); 源代码网推荐 context.Response.Cache.SetMaxAge(TimeSpan.Zero); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 当ASP.NET AJAX发现即将执行的方法被设置了CacheDuration时,它会将HttpCacheability.Server作为参数调用当前上下文中HttpCachePolicy的SetCacheability方法,这样请求的结果将会被缓存以便将来使用。如果将要执行的方法含有参数,那么通过VaryByParams属性从HttpCachePolicy中得到的HttpCacheVaryByParams对象里“*”这一项将被设为true,由此可知,ASP.NET会为不同的参数组合缓存不同的结果。 源代码网推荐 源代码网推荐 我们来看一下缓存的效果: 源代码网推荐
源代码网推荐 与通过自己编程来缓存数据相比,设置CacheDuration属性来缓存结果的最大优势就在于使用方式是在简单。现在我们就可以将注意力完全放在方法的自身实现上而不用处理缓存中会出现的问题(例如:同步问题)。这个方法也提高了少许性能,因为现在已经无需将结果序列化成JSON对象了,ASP.NET将全权负责将缓存的数据发送到各客户端。但是在某些时候由我们来缓存数据会更合适一些,因为这样可以省下服务器端的资源。例如,以下是一个接受四个参数的方法,其中第二个参数表示是否应该将剩下的两个参数忽略: 源代码网推荐 源代码网推荐 public string GetResult(int key, bool ignoreRest, string args1, string args2) { ... } 源代码网推荐 源代码网推荐 在这种情况下,几乎所有的程序员都会在ignoreRest参数为true的情况下仅仅根据key参数的不同值来缓存数据。但是ASP.NET无法得知参数的含义,因此它会为所有的参数组合形式各缓存一份数据,而不去关心它们是否相同。 源代码网推荐 源代码网推荐 客户端缓存 源代码网推荐 我使用HttpWatch Basic Edition来捕获客户端和服务器端之间的通信。这是捕获结果的截图: 源代码网推荐
源代码网推荐 每当我们访问Script Method时,相同的内容会被POST到服务器端,并且得到相同的结果。尽管结果被缓存了,我们只是节省了方法的执行时间,但是round-trip的数量依旧没有减少。这意味着如果结果的数据量很大,或者带宽很窄,对用户来说访问Script Method依旧是个耗时的过程。因此如果我们能够在客户端缓存结果的话,用户使用相同参数访问方法时就可以立即得到数据,即使在网络中端的情况下。 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
