随笔-312  评论-12034  文章-2  trackbacks-256

前几天曾经发过一篇《ASP.NET AJAX(Atlas)和Anthem.NET——管中窥豹般小小比较》,Jeffrey Zhao说用ASP.NET AJAX中的UpdatePanel似乎不大好。我想了想确实如此,有些高射炮打蚊子的感觉。还有朋友希望我也能在比较中关照一下Ajax.NET Professional——同样是个ASP.NET平台上非常优秀的Ajax框架。

种种要求下,形成此文。本文将比较在ASP.NET AJAX(Atlas)、Anthem.NET和Ajax.NET Professional这三个知名ASP.NET上Ajax框架中实现客户端调用服务器端方法的实现。客户端调用服务器端方法是每一个Ajax框架都必须考虑的问题,非常具有代表性。在程序编写过程中,我也将抛弃掉某些框架中提供的“智能的”服务器端控件(例如ASP.NET AJAX的UpdatePanel),而完全用手工JavaScript和C#实现,力求创造出较为“公平”的比较环境。

由于本文侧重于“比较”,而不是“介绍”,所以对于基础知识都一笔带过。有需要详细了解程序实现,或是希望重现实验结果的朋友,可以下载本文附带的代码。

 

程序要实现的功能

程序功能很简单,却也足够典型:

  1. 用户点击页面上的某个<input>按钮
  2. 浏览器执行该按钮的客户端JavaScript事件处理函数
  3. 该JavaScript事件处理函数调用某服务器端方法
  4. 服务器端方法执行并返回当前时间
  5. 客户端JavaScript回调函数执行,将服务器端返回的时间显示在页面中一个<span>中

 

程序运行界面

由于这三个程序的界面、行为以及实现功能都完全一致,所以这里仅以ASP.NET AJAX(Atlas)版本的为例。下面是程序初始化之后的界面:

点击按钮,上面介绍的5个步骤将依次执行,最终得到如下图所示的结果,显示出服务器端时间:

 

ASP.NET AJAX(Atlas)版本的实现代码

首先是页面的HTML部分,注意ASP.NET AJAX(Atlas)独有的ScriptManager控件:

<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div>
    <input type="button" value="Get Server Time" id="btnGetServerTime" onclick="return btnGetServerTime_onclick()" />
    <span id="result" />
</div>

然后是客户端JavaScript部分,注意用PageMethods.GetServerTime()这样的形式调用服务器端方法:

function btnGetServerTime_onclick() {
    PageMethods.GetServerTime(cb_getServerTime);
}
 
function cb_getServerTime(result) {
    document.getElementById("result").innerHTML = result;
}

服务器端代码如下,注意方法必须为静态,且添加[System.Web.Services.WebMethod]和[Microsoft.Web.Script.Services.ScriptMethod]两个属性:

[System.Web.Services.WebMethod]
[Microsoft.Web.Script.Services.ScriptMethod]
public static string GetServerTime()
{
    return DateTime.Now.ToString();
}

OK!

 

Anthem.NET版本的实现代码

首先是页面的HTML部分,没什么过多需要注意的:

<div>
    <input type="button" value="Get Server Time" id="btnGetServerTime" onclick="return btnGetServerTime_onclick()" />
    <span id="result" />
</div>

客户端JavaScript部分,注意用Anthem_InvokePageMethod辅助函数调用服务器端方法:

function btnGetServerTime_onclick() {
    Anthem_InvokePageMethod("GetServerTime", [], cb_getServerTime);
}
 
function cb_getServerTime(result) {
    document.getElementById("result").innerHTML = result.value;
}

最后是服务器端代码,注意Page_Load中要注册一下(与ASP.NET AJAX中的ScriptManager有异曲同工之妙)。还有方法应用了[Anthem.Method]属性:

[Anthem.Method]
public string GetServerTime()
{
    return DateTime.Now.ToString();
}
 
protected void Page_Load(object sender, EventArgs e)
{
    Anthem.Manager.Register(this);
}

OK!

 

Ajax.NET Professional版本的实现代码

页面的HTML部分和Anthem.NET版本的完全一致:

<div>
    <input type="button" value="Get Server Time" id="btnGetServerTime" onclick="return btnGetServerTime_onclick()" />
    <span id="result" />
</div>

客户端JavaScript部分倒于与ASP.NET AJAX得有几分神似,注意“ASP.ajaxpro_aspx”这个东西为本ASP.NET页面编译后的类名:

function btnGetServerTime_onclick() {
    ASP.ajaxpro_aspx.GetServerTime(cb_getServerTime);
}
 
function cb_getServerTime(result) {
    document.getElementById("result").innerHTML = result.value;
}

服务器端代码类似Anthem.NET版本的实现方式,同样需要在Page_Load中注册,且需要为方法应用一个属性——不过这里是[AjaxPro.AjaxMethod]:

[AjaxPro.AjaxMethod]
public string GetServerTime()
{
    return DateTime.Now.ToString();
}
 
protected void Page_Load(object sender, EventArgs e)
{
    AjaxPro.Utility.RegisterTypeForAjax(this.GetType());
}

OK!

 

实现方式比较

用图表说话吧,我也同样不再评论了:

 

源代码下载

这个是我进行本次实验所用到的程序源代码:3ASPNETAJAXFrameworksTest.zip

posted on 2006-11-27 13:39 Dflying Chen 阅读(13497) 评论(35)  编辑 收藏 网摘 所属分类: ASP.NET AJAX (Atlas)新技术介绍

评论:
#1楼 2006-11-27 13:50 | Jeffrey Zhao      
Anthem为什么会这么高?ViewState在里面吗?
ASP.NET AJAX和AJAX.NET Pro传输的都是最基本的数据,所以非常少,它们可以说是没有任何差别的,一些数据上的差异都是表示方法的关系,可以忽略不计。

  回复  引用  查看    
#2楼 2006-11-27 13:56 | Nick Yao      
看来整体性能是Ajax.Net Pro 最好~~
不过方便性应该不够Asp.Net Ajax,毕竟是微软官方的

  回复  引用  查看    
#3楼 2006-11-27 14:07 | Jeffrey Zhao      
@Nick Yao
我认为还是ASP.NET AJAX好。首先ASP.NET AJAX比AJAX.NET Pro使用上的确方便,ASP.NET AJAX发送到客户端代码多的原因只是它发送了不少客户端的扩展,而AJAX.NET Pro没有很多扩展。

  回复  引用  查看    
#4楼[楼主] 2006-11-27 14:12 | Dflying Chen      
@Jeffrey Zhao
没有,不过Anthem包含了很多控制信息。

  回复  引用  查看    
#5楼[楼主] 2006-11-27 14:13 | Dflying Chen      
@Nick Yao
就这样一个程序,确实AjaxPro比较突出,呵呵

  回复  引用  查看    
#6楼 2006-11-27 14:14 | neuhawk      
同意: Jeffrey Zhao
  回复  引用  查看    
#7楼[楼主] 2006-11-27 14:15 | Dflying Chen      
@Jeffrey Zhao
其实就这个程序来说,Atlas和AjaxPro都差不多,不过Atlas脚本太多了

  回复  引用  查看    
#8楼[楼主] 2006-11-27 14:17 | Dflying Chen      
@neuhawk
不管怎么样,官方的东西始终会占有优势的。

  回复  引用  查看    
#9楼 2006-11-27 14:40 | Terry Deng      
@Dflying Chen
很不错的对比,不过我有个疑问,测试的对比数据是如何得出的?

  回复  引用  查看    
#10楼 2006-11-27 15:23 | Terry Deng      
下载了实验的源代码看了看,发现里面Anthem.net的版本是1.3.2,已经是比较旧的版本了,我用1.4版本的换上去,感觉执行代码的速度比你原来的那个1.3.2版本快了不少,当然是感觉,希望dflying chen能本着公平的精神使用1.4版本再进行测试一下看看结果,1.4的DLL在这里下载/Files/aspxcn/Anthem.rar

  回复  引用  查看    
#11楼[楼主] 2006-11-27 18:41 | Dflying Chen      
@Terry Deng
随便一个HTTP嗅探器就可以了

  回复  引用  查看    
#12楼[楼主] 2006-11-27 18:42 | Dflying Chen      
@Terry Deng
恩,再试试看

  回复  引用  查看    
#13楼 2006-11-29 15:25 | Anthan      
我刚做完一个项目,是用Anthem 1.1.0.0 的,但使用了ViewState压缩,性能还可以吧。
两外两种还没有用过,Anthem 1.1.0.0也是因为有代码才敢用到实际项目中。
不然出了事我可兜不住啊。呵呵

  回复  引用  查看    
#14楼[楼主] 2006-11-29 21:25 | Dflying Chen      
@Anthan
呵呵,Atlas其实也不错的,可以试试看阿

  回复  引用  查看    
#15楼 2006-12-01 11:20 | Anthan      
@Dflying Chen
接下来的项目要用到Atlas,老大们在评估风险,而我现在正在学习呢,你的博客是每天必来,并且受益匪浅啊!

  回复  引用  查看    
#16楼[楼主] 2006-12-01 13:35 | Dflying Chen      
@Anthan
谢谢支持!这两天有点忙,写得不多

  回复  引用  查看    
#17楼 2007-02-11 21:29 | 爱爱堂[未注册用户]
你好,我现在用的是asp.net ajax1.0 。可能和你的例题有所不同了。
我刚刚测试了一下,提示PageMethods.GetServerTime(cb_getServerTime);
找不到PageMethods这个函数,而且1.0的引用
好像是这个System.Web.Script.Services.ScriptMethod吧。

我以前用的是ajaxpro2.0 ,都是一些静态的HTM页面,不知道在asp.net ajax1.0里面静态页面是怎样调用服务器端方法的啊?

谢谢!!!

  回复  引用    
#18楼[楼主] 2007-02-12 22:00 | Dflying Chen      
@爱爱堂
将ScriptManager的EnablePageMethods属性设置为true即可

  回复  引用  查看    
#19楼 2007-03-09 11:14 | tloner      
如果需要向服务端提交信息呢?应该怎么写
比如把当前页面上的时间提交到服务端,服务端把当前系统时间和提交的时间相加,然后返回

  回复  引用  查看    
#20楼 2007-03-09 11:44 | tloner      
已经搞掂了,呵呵
  回复  引用  查看    
#21楼[楼主] 2007-03-10 11:03 | Dflying Chen      
@tloner
不好意思没有及时回复,不过搞定了就好,谢谢关注

  回复  引用  查看    
#22楼 2007-03-22 17:52 | liuyuer
PageMethods 未定义,怎么解决啊?

ScriptManager的PageMethod已经true了

方法也shared了,就是未定义未定义未定义,快疯了。


  回复  引用    
#23楼[楼主] 2007-03-23 10:21 | Dflying Chen      
@liuyuer
你看看客户端有没有下载到这些JavaScript文件呢?用嗅探器看看哪个请求有问题?

  回复  引用  查看    
#24楼 2007-03-26 00:06 | YAO.NET℡      
小的功能不能太说明问题,我想要在较大规模开发中,对比才有实际意义.
如果就这样的简单功能,不管用那一个,差也就差几行的代码,数据量差别也是以B计算的.

比如在这个例子中,ASP.NET AJAX可能不是最优的,但在大规模有一定量的开发中,也许他却可以获得很高的开发效率.

希望能有一些宏观上的,较大层面的对比,这样对于一个较大的项目引入一个ajax框架,风险才是可控制的.




  回复  引用  查看    
#25楼[楼主] 2007-03-26 08:36 | Dflying Chen      
@YAO.NET℡
我完全同意你的说法,有空的时候我会再比较一下的

  回复  引用  查看    
#26楼 2007-04-30 11:27 | 48851465[未注册用户]
PageMethods 未定义,怎么解决啊?

ScriptManager的PageMethod已经true了

方法也是PUBLIC 了,加上了 [System.Web.Services.WebMethod()]
还是提示PageMethods 未定义 ,我是在ASCS里面使用的

  回复  引用    
#27楼[楼主] 2007-05-02 23:43 | Dflying Chen      
@48851465
客户端有没有得到JavaScript脚本呢?web.config的配置是否正确?

  回复  引用  查看    
#28楼 2007-12-26 15:31 | james.xiang[未注册用户]
我在vs2005中新建一个AJAXEnabledWebSite网站,我在页面中写方法的时候,找不到[Microsoft.Web.Script.Services.ScriptMethod]引用,我的ajax版本是v1.0.61025?
错误信息是:
编译错误
说明: 在编译向该请求提供服务所需资源的过程中出现错误。请检查下列特定错误详细信息并适当地修改源代码。

编译器错误信息: CS0234: 命名空间“Microsoft”中不存在类型或命名空间名称“Web”(是缺少程序集引用吗?)

源错误:



行 15: }
行 16: [System.Web.Services.WebMethod]
行 17: [Microsoft.Web.Script.Services.ScriptMethod]
行 18: public static string GetServerTime()
行 19: {


源文件: f:\AJAXEnabledWebSite1\Default.aspx.cs 行: 17



显示详细的编译器输出:


D:\Program Files\Microsoft Visual Studio 8\Common7\IDE> "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc.exe" /t:library /utf8output /R:"C:\WINDOWS\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll" /R:"C:\WINDOWS\assembly\GAC_MSIL\System.Xml\2.0.0.0__b77a5c561934e089\System.Xml.dll" /R:"C:\WINDOWS\assembly\GAC_32\System.EnterpriseServices\2.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll" /R:"C:\WINDOWS\assembly\GAC_MSIL\System.IdentityModel\3.0.0.0__b77a5c561934e089\System.IdentityModel.dll" /R:"C:\WINDOWS\assembly\GAC_MSIL\System.Web.Extensions\3.5.0.0__31bf3856ad364e35\System.Web.Extensions.dll" /R:"C:\WINDOWS\assembly\GAC_MSIL\System.Drawing\2.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll" /R:"C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel.Web\3.5.0.0__31bf3856ad364e35\System.ServiceModel.Web.dll" /R:"C:\WINDOWS\assembly\GAC_MSIL\System.Web.Services\2.0.0.0__b03f5f7f11d50a3a\System.Web.Services.dll" /R:"C:\WINDOWS\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll" /R:"C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll" /R:"C:\WINDOWS\assembly\GAC_MSIL\System.Configuration\2.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll" /R:"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll" /R:"C:\WINDOWS\assembly\GAC_MSIL\System.WorkflowServices\3.5.0.0__31bf3856ad364e35\System.WorkflowServices.dll" /R:"C:\WINDOWS\assembly\GAC_MSIL\System.Web.Mobile\2.0.0.0__b03f5f7f11d50a3a\System.Web.Mobile.dll" /R:"C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll" /R:"C:\WINDOWS\assembly\GAC_MSIL\System.Runtime.Serialization\3.0.0.0__b77a5c561934e089\System.Runtime.Serialization.dll" /out:"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\ajaxenabledwebsite1\2e674235\fa9803be\App_Web_prlidxpm.dll" /debug- /optimize+ /win32res:"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\ajaxenabledwebsite1\2e674235\fa9803be\prlidxpm.res" /w:4 /nowarn:1659;1699 "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\ajaxenabledwebsite1\2e674235\fa9803be\App_Web_prlidxpm.0.cs" "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\ajaxenabledwebsite1\2e674235\fa9803be\App_Web_prlidxpm.1.cs" "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\ajaxenabledwebsite1\2e674235\fa9803be\App_Web_prlidxpm.2.cs" "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\ajaxenabledwebsite1\2e674235\fa9803be\App_Web_prlidxpm.3.cs" "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\ajaxenabledwebsite1\2e674235\fa9803be\App_Web_prlidxpm.4.cs"


Microsoft (R) Visual C# 2005 编译器 版本 8.00.50727.1378
用于 Microsoft (R) Windows (R) 2005 Framework 版本 2.0.50727
版权所有 (C) Microsoft Corporation 2001-2005。保留所有权利。

f:\AJAXEnabledWebSite1\Default.aspx.cs(17,16): error CS0234: 命名空间“Microsoft”中不存在类型或命名空间名称“Web”(是缺少程序集引用吗?)



  回复  引用    
#29楼 2008-01-22 09:47 | 啊彬[未注册用户]
@james.xiang
你把那句删除掉就可以了,我是这样做了就可以了.

  回复  引用    
#30楼 2008-03-05 17:18 | 咦[未注册用户]
PageMethods.GetServerTime(cb_getServerTime);
这句不太理解哎
不是应该是这样吗?
cb_getServerTime(PageMethods.GetServerTime());

  回复  引用    
#31楼 2008-03-17 15:42 | Terry wen[未注册用户]
Anthem 总的传输数据不过23K而其他两项都超过23K。结果显而易见。
  回复  引用    
#32楼 2008-04-10 07:30 | glshu[未注册用户]
请教一下,ASP.NET AJAX(Atlas)版,上面的方法是不带参数的,如何调用一个带参数的方法.
  回复  引用    
#33楼 2008-05-08 08:11 | weiguangqin[未注册用户]
怎样使用服务器的TEXTBOX1_OnChange事件,因为此事件没有反应不能触发,如果使用HTML中的TEXTBOX1_OnKeyUp事件那么怎样在此事件里调用服务器方法(即CS文里的方法)
  回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 573860




相关文章:

相关链接: