本文将试图考察一下目前.net平台的下的ajax框架……
在这里我将试图考察一下目前.net平台的下的ajax框架,我也试图从中总结出来一种方法,使得你可以在众多基于.net平台的ajax框架和工具包中 找到你所合适的一种,同时也希望你在考察、预研和使用这些流行的这些ajax-net 的框架时,做得理性和有的放矢。
我想,文章的方法会给目 前使用ajax的.net用户带来帮助,从而提高你在.net平台下使用ajax的体验。为什么这么说,因为最近我的一个客户(应该是一些客户)的研发主 管对我说,我们对atlas 非常兴趣,想了解更多一些相关的内容和如何开始看待atlas,因为下个月会来一个atlas的专家和我们交流。因为我知道这个主管手上掌握着一个 ajax架构的业务应用,目前在考虑从.net v1.1迁移到.net v2.0,atlas能在怎样的程度上帮忙他或他的team?我没有说太多,因为心里我有些吃惊,目前的他们的架构应用atlas 可能并不是一个明智的选择,当然这个担心基于我目前对atlas的理解。
我列举和讨论的ajax-net的框架和工具包括 atlas(jan ctp), anthem.net, magicajax.net , ajax.net professional 和wwhoverpanel control,这基本都是我关注的.net平台的下的ajax 的一些框架和实现。 基本上也都是我的这篇文章中列举的,另外一个原因是因为他们基本上都是开源的,这个非常重要,因为没有源代码,我们将不知道究竟发生了什么。另外我无意于 使之成为像daniel zeiss作的这个比较报告。
首先,开门见山的说明我的观点。
对于开源或现有的 ajax-net技术或框架的选用必须针对你目前应用的架构来选取和考虑,如果你目前的架构是"似ajax"的,那么你在选择现在所有流行的ajax- net的技术的时候都必须非常小心;而如果你目前的应用是使用传统的asp.net的应用架构(或准备用asp.net v2.0开始创建新的应用),那么目前流行的ajax-net的框架和技术都是普遍适合的,关键你要在合适的时机选择合适的某个框架或实现。
在我的眼中,目前流行的ajax-net的框架或实现都是add-in (plug-in)的模式的,也就是说这些框架对于所有后一种即使用传统的asp.net的应用架构(或准备用asp.net v2.0开始创建新的应用)是awared的也就是非常有利和方便的。但对于"似ajax"的架构来说,情况有所不同,需要你从另外的角度来衡量,有选择 的使用。
那什么是"似ajax" 的架构呢,这就是说,你的应用程序是在ajax概念提出之前就创建的。从客户端和服务器端的交互分析来说,你的客户端有大量的javascript 代码接受xml数据,进行对象的序列化,然后使用javascript配合其它的html技术展现这些对象和数据,也可能你还有一堆htc或其它的 javascript的html表现层控件。你的服务器端是一个facade(或者是adapter,observer)模式的(handler)控制 器,接收客户端javascript的xml请求数据后,然后解析xml,然后调用相应的某个服务或业务组件,再将结果以xml的形式返回给客户端 javascript ,客户端的javascript接收之后,再进行处理和显示,因为可以使用html的dom 和css,所有页面的展现是动态的。
这样客户端是
而且目前流行的ajax-net的框架基本上都没有实现双向序列化,因为实现一个textbox的自动完成客户端 只用接收数据就行了,根本不用传回数据/对象到服务器端,同样做一个ajax的状态进度条也不用,但这些都是ajax啊,我们衡量的标准是异步的、页面没 有刷新。
很抱歉,我用了这么字才解释完我的观点。最后可以这么说,如果你的应用已经是ajax架构的,那么你需要仔细选择使用目前 的ajax-net框架,确保它也提供双向序列化功能,兼容你原来的应用和架构。如果你的应用不是ajax架构的,那么你可以依据一些条件来选择ajax -net框架。
然后我们回到文章的开始,来看一些流行的ajax-net框架
magicajax.net
这是目前框架中版本号最小的一个ajax-net实现,许多人很喜欢它,甚至一见如故,但真的看过它的代码之后,我有些担忧。
magicajax.net基于这样一种策略,即__dopostback 会提及整个的asp.net页面,这样会导致页面刷新,所以magicajax.net使用ajaxcbo.dopostcallback 做局部的提交,而每个ajaxpanel 中的内容则对应客户端即时的html内容,因为在magicajax.net中,客户端只用执行eval(responsetext) 服务器端rendered返回的html就可以了(很被动)。
由于dopostcallback 会提交viewstate 以及ajaxpanelx$rbs_store,几乎是用xmlhttprequest 模拟一个正常的提交,所以服务器端可以创建页面的实例也可以根据viewstate 恢复所有的控件状态,同样ajaxpanel 以及ajaxcontrol 也都会实例化,然后接收客户端传来的_eventtarget, _eventargument 走正常的asp.net控件的处理过程,等控件rendered之后,最终的html输出被传回客户端,然后被客户端的eval 显示出来。
整个过程非常巧妙,这几乎是asp.net __dopostback 的"hook asp.net"版和加强版本。而httpmodel 主要是为了解决session和交叉提交,进行客户端javascript的整理和注入,当然也是这里接收客户端的请求,在 application_endrequest中返回结果。剩下的代码都是处理控件在vs web design中的设计时支持。ajaxcallobject.js 和webparts.js 每次都要传到客户端。
magicajax.net 的一些不足和想法:
- 1、__dopostback 的加强版,适合于asp.net的高级用户使用
- 2、由于和asp.net的页面处理机制依赖非常密切,控件的默认动作发生变化则可能不工作,比如第三方的某个自定义控件;
- 3、依赖viewstate ,如果是加密的viewstate,则可能工作不正常,我没有试,在代码中好像没有看见__viewstateencrypted
- 4、是对asp.net 全部页面提交的优化,实现有限的ajax功能,可扩展性不大
如果是基于asp.net 提供的控件和开发,那么magicajax.net 是非常有效的,很好的解决了session和跨页面状态的问题。而且客户端的操作和工作基本可以忽略,magicajax.net设计贴近最近的 asp.net的版本,目前不提供调用客户端直接调用页面的方法。但随着其发展,优势可能渐少,因为atlas 最新的版本提供类似的updatepanel 控件。
ajax.net professional
我没有看过ajax.net professional 的源代码,但从例子中看得其支持调用页面的某个方法,以及返回对象,dataset,datatable的数据,我认为ajax.net professional 的实现和anthem.net 原理是一样的,虽然ajax.net professional 使用了http model,这个只是和anthem.net 一样,最终处理结果的返回处理上稍有不同不同。比较起来,ajax.net professional 没有重新继承所有常用的asp.net控件实现部分提交的功能,所以可能ajax.net professional 比较强项的是调用页面上的某个方法,并在客户端获得结果的数据,这个已经够实现大部分的ajax的功能了。
从这个层面上看,我认为 ajax.net professional 是相对笨重和复杂了。anthem.net不使用http model,提供控件基本的局部提交,也提供数据层面的客户端方法调用。ajax.net professional 的源代码似乎总是不想共享 ,这也是我不喜欢它的另外一个原因。
无论如何,大家都没有提供两路的数据交换,即客户端可以获得服务器端的方法并获得结果和数据,但是目前都支持将这些对象/数据修改之后返回给服务器端。
anthem.net 的一些不足和想法:
- 1) anthem.net 也是一种"hook asp.net"原理,旨在弥补asp.net的整页面的提交和postback,并且在客户端的数据访问和交互上做了加强。
- 2) anthem.net需要重新将asp.net提供的控件进行继承和包装,所以使用和功能的兼容性上非常敏感。
- 3) 也许微软下个版本的asp.net的标准控件可以借鉴anthem.net的做法,给各个控件增加这个远程回调的接口。
- 4) 目前版本的功能已经非常强大和略有些复杂了,而且部署比较方便,无需设置http model。
wwhoverpanel ajax control for asp.net
wwhoverpanel ajax control for asp.net 这也是一个asp.net的控件,但是提供了客户端回调(高级回调)、客户端调用页面方法,以及双向两路的序列化功能。
wwhoverpanel 吸取了magicajax.net 和 anthem.net的优点,同时又结合了asp.net的客户端回调功能,是一个轻量级的ajax组件。
看待wwhoverpanel 最大的两个特性中的一个是用很简单的方式实现了一个hoverpanel behavior,这个实现比目前atalas的behavior 要简单,作者rick strahl 也强调这个主要是结合他具体的应用,比如这里提供了一个小的html板,可以显示获得的结果信息。
wwhoverpanel 也提供一个局部回调的方法,但是这点的实现上和magicajax.net 以及 anthem.net完全不同,它是使用一个startcallback的javascript来组合查询字符串提交并且使用xmlhttp发请求到服务 器的某个页面(由serverurl 属性指定),之后这个页面将结果以response.write()的原生html内容返回。这个和asp.net的回调方法非常类似,而且还支持将请求 发到本页之外的asp.net并获得结果,所以它增强了原来asp.net的客户端回调的方法,即支持其它页面的回调。可以说,这是一种基于url的客户 端回调。
wwhoverpanel 提供的第二个功能是,客户端可以调用服务器端中的某个页面的方法(这些方法以[callbackmethod]进行标识),这种情况下,你要设置 eventhandlermode="callpagemethod" ,然后使用wwhoverpanel.服务器方法名(参数,参数,...,回调处理函数)的方式进行调用。这个其实使用的是一个javascript的 callmethod 方法,调用服务器端的请求。javascript 的handlecallback 则用来处理返回的结果,逻辑相对简单,尽管控件的innerhtml 也被赋值,但这个主要是为了维护作为客户端回调结果显示的小的html板的内容,否则就是调用页面中的方法了,那么结果就直接给客户端的回调方法了。
特色三,就是我说的双路的序列化功能了,其实这个场景我们也非常需要,比如我们用客户端回调或xmlhttp请求获得了一个定单对象,那么客户端修改之 后,我还想把它作为一个客户端调用的输入参数,返回到服务器端。这时候两路双向的序列化就需要了,因为这次服务器需要将javascript的函数传了的 数据序列化成.net的类。这也就是json的双向序列化了(主要代码在jsonserializer.cs ),这也是我挺喜欢的一个功能,因为我对这个功能关注很久,但是目前流行的ajax-net的框架都不支持这个功能。
anthem.net
目前是1.0版本,其设计理念是通过另外一个思路,遵循这样的理念--既然asp.net的各个标准控件没有实现提交功能,那么我可以产生一个提交的接口,然后继承原来的标准控件,然后再实现这个接口,这样每个控件都可以向服务器端单独进行提交。
每个控件的发生过程类似magicajax.net,anthem.net提供了各个控件javascript端的提交函数-这等于也截取了 __dopostback,之后anthem.net 还提供了完善的客户端的事件比如postcallback 和precallback 这样的客户端事件,之后也将使用xmlhttprequest 模拟一个传统的页面提交请求到服务器端,服务器端生成页面实例,这个过程和magicajax.net一样,最后是将rendered的html在控件的 render() 事件传回到客户端,客户端控件的innerhtml被赋值,动态更新。
和magicajax.net不同的是, anthem.net没有容器的概念,因为每个控件都增加了提交接口,所以可以单独的提交,所以单位是以一个控件为单位进行一次提交, anthem.net的花费更小些(但服务器端是类似的,因为整个asp.net页面的pipeline都会进行)。
此外, anthem.net 还有另外的功能,就是可以通过客户端调用页面中的方法并获得结果/数据,这种情况下,你将调用anthem_invokepagemethod 方法,而不是anthem.net提供的默认各个控件的提交方法。这样javascript的回调处理函数中的result.value 将可以获得调用的服务端的某个方法(该方法以[anthem.method]为标记)的执行结果,因为javascriptpost的数据中有 page/masterpage/control 了,那么服务器端很容易通过这个标识获得方法的地址,应用反射寻找[anthem.method]标记,然后调用,将结果返回到客户端。
anthem.net支持返回对象,dataset,datatable和 writedatarow(writedataset,writedatatable,writedatarow,writeobject),返回的是符 合是json规范的字符串,这样客户端的javascript就可以使用这些对象了。不同于magicajax.net,anthem.net 没有使用http model,所以结果是在页面的prerender() 事件中处理和返回请求的结果。
目前在wwhoverpanel 的场景中,我认为这是一种轻量级的实现,对于多层嵌套多组引用的对象图类型或是大规模容量访问压力下,客户端和服务器端都还需要优化,所以如果其作为ajax架构,客户端和服务器端通信和传递数据的通讯层上,显然是有些单薄了。
wwhoverpanel 的一些不足和想法:
- 1) 该控件是目前我见过.net平台下,惟一同时支持客户端回调和页面方法调用的ajax 控件,同时又支持两路双向的序列化。
- 2) 相对来说,wwhoverpanel是设计最简单的一个,而且是基于控件不依赖http model和asp.net page pipeline,也不依赖viewstate
- 3) 该控件能够让你在ajax特性实现的技术层面上,能够在客户回调和客户端调用页面方法两者中取得平衡。
- 4) 目前的客户端回调支持其它页面的回调,但是其结果输出需要输出原始的html,这个影响应用的分层和设计。
- 5) json的双向序列化是一个不错的方案,但高性能的场景下,应该考虑实现更高效的序列化框架
atlas
这个产品,我就不列举具体的功能了,而主要说一下我对其的看法和持有的态度。因为在我的ajax书评中提到过问题。
atlas 是一个个性鲜明的产品,其优点是明显的,缺点也是明显的,但首先你必须认识到它还是一个比较复杂,拥有较高学习曲线的解决方案。对于其复杂性,老实说目前,大多数人还缺乏真实的感受。
最近的一个个版本-jan ctp,我们看到了一些特性,其强大之处在于:
- 1.客户端(javascript)的数据绑定、校验带来便利。
- 2. 新的update panels不仅拥有了magicajax.net 的特性,而且功能更强,是目前atlas中异步回调的主要控件。
- 3.内置了一些具体ajax特性的控件,比如autocompleteextender ,dragoverlayextender
- 4. 提供了一些使用的控件比如,scriptmanager, triggers ,timercontrol
- 5. 主要用途着重在提供一个客户端控件和服务器端控件的特性集成的方案和容易使用的开发效率上。
但缺点也是明显的,比如:
- 1. 客户端的behaviors还很弱,模板(templates)和ui增强(ui enhancements)功能还没有看到。
- 2. 所谓的客户端atlas控件(“atlas” client controls)和服务器端的atlas控件(“atlas” server controls) 还没有一个明确的规范,所以现在你基本上还不能创建自定义的atlas控件(无论客户端还是服务器端的)。
- 3. 目前还只支持调用web services的服务,对于asp.net的内置的服务以及wcf的服务支持也没有看见,也不支持页面或控件内的方法调用
- 4. 功能上还不稳定,一些功能仅是在特定条件下的特性实现,还不能满足部署生产环境的要求。我认为,如果atlas发布go-live license,那么可以考虑atlas的放入到正式的项目或应用中。
我并不建议,你现在就将它应用在一个老的asp.net 项目中,或是老项目迁移到asp.net v2.0时优先考虑它;更多时候,如果你是创建一个新的asp.net应用,而又跨越了其学习曲线的情况下,可以考虑使用它。目前的情况下,对于 atlas,我建议,你应该保持足够的关注和实践学习,但是要抑制住将其应用到项目中的兴趣;因为ajax,你现在可以开始关注和学习它,但是你不能因为 要实现ajax一个特性,而立即选择atlas,那么是可能有风险的。
注: atals 的microsoft.web.script.serialization 命名空间中有javascriptobjectdeserializer和javascriptobjectserializer两个对象,第一,我不确 定其是否也是json 序列化,而且我也不确定目前是否支持两路双向的序列化;第二,目前的版本,我还不能进行自定义或扩展,同时也很难对于其性能做任何的结论 。
闽公网安备 35060202000074号