- 浏览: 36692 次
最新评论
Client Callback 是ASP.NET 2.0新增的一个特性。简单的说,就是在不刷新页面的情况下,用javascript向服务器端传递参数、调用服务器端的方法、并且得到服务器端的返回值进行处理。<!----><o:p></o:p>
<o:p> </o:p>
1> Why Client Callback<o:p></o:p>
<o:p> </o:p>
HTTP是无状态的协议。在HTTP协议之上开发的项目,常常需要从客户端调用服务器端的方法、执行服务器端的代码、从服务器端获取数据。这些都首先需要提交当前的页面,并且产生一次Postback过程。每次Postback都会让客户端的浏览器重新Render当前的页面。<o:p></o:p>
<o:p> </o:p>
这样的事件模型下,开发员不得不小心地维护客户端各控件的当前状态以保证它们不会丢失、不得不小心地维护ViewState的状态以避免出现不一致的情况。同时,庞大的ViewState也会造成页面的冗杂、下载速度变慢。另一方面,重新Render页面当然会耗费浏览器的时间来处理。如果页面很“重”——比如有很多的DHTML或者很多的控件——这当然会增加客户的等待时间,而频繁的等待常常会让客户不耐烦。最后,页面的频繁刷新恐怕会把所有人的眼睛弄花。<o:p></o:p>
<o:p> </o:p>
因此,从客户端代码(javascript)里调用服务器端的方法,以避免页面重新Rener和频繁刷新就是很有必要了。<o:p></o:p>
<o:p> </o:p>
2> XMLHTTP<o:p></o:p>
<o:p> </o:p>
在ASP.NET 2.0之前,我们实现这一功能的方式主要是XMLHTTP。Client Callback的底层实现机制也是XMLHTTP。XMLHTTP是在客户端详服务器端发送请求并且得到服务器端返回值的一种古老而经典的技术,比如下面这个例子。
<o:p>
function getXmlHttp ( )
{
var XmlHttp = new ActiveXObject("Msxml2.XMLHTTP.4.0");
XmlHttp.Open("GET", "http://www.yahoo.com", false);
XmlHttp.Send();
var homesource = XmlHttp.responseText ;
document.all.aa.innerHTML = homesource ;
}
</script>
<body id="bodyTag">
<input type="button" name="btnyahoo" value="click 4 yahoo" onclick="getXmlHttp();">
<div id="aa" name="aa"></div>
</body>
当点击button时,触发的javascript函数会创建一个HTTP的请求,并发送给指定的URL。接收到服务器端的响应之后,把收到的信息展现出来,我们就可以在自己的网页中看到yahoo的页面了。<o:p></o:p>
<o:p> </o:p>
这一句XmlHttp.Open("GET", "http://www.yahoo.com", false);的第一个参数标识HTTP请求的方式是“GET”或者“POST”。第二个参数是请求发送目的的指定URL,可以在URL中包括以“?”标识以“&”连接的查询字符串。第三个参数是标识页面的请求与页面的响应是否同步,即是否应该等待服务器端的响应之后再进行页面的下一步响应。此处设为false,既不等待服务器端的响应,以异步方式处理。<o:p></o:p>
<o:p> </o:p>
接下来的一句XmlHttp.Send();是发送刚刚生成的HTTP请求。我们可以将要传给服务器端的参数填入Send函数的参数里,在服务器端进行解析。<o:p></o:p>
<o:p> </o:p>
接受的信息不仅仅是ResponseText的信息。如果把XmlHttp.responseText 改成XmlHttp.GetAllResponseHeaders;,我们就可以看到服务器发回的所有HTTP头信息了:)<o:p></o:p>
<o:p> </o:p>
3> Client Callback in ASP.NET 2.0 <o:p></o:p>
<o:p> </o:p>
ASP.NET 2.0中新增了ICallbackEventHandler接口和Page.GetCallbackEventHandler方法来实现Client Callback的调用。<o:p></o:p>
<o:p> </o:p>
ICallbackEventHandler接口只有一个方法需要实现:string RaiseCallbackEvent(string eventArgument);这个方法就是在服务器端处理客户端调用请求的方法。参数eventArgument是从客户端传递的参数,返回值则是需要返回给客户端的处理结果。<o:p></o:p>
<o:p> </o:p>
Page.GetCallbackEventHandler方法共有三个重载方法,但都大同小异。这个方法的作用是生成一段在初始化Callback时供客户端调用的javascript代码段。以下面这种重载实现为例:
<o:p>
public string GetCallbackEventReference(System.Web.UI.Control control, string argument, string clientCallback, string context, string clientErrorCallback);
第一个参数是实现了ICallbackEventHandler接口的控件,.Net Framework将在内部调用该控件实现的RaiseCallbackEvent的方法。一般该参数为Page本身。第二个参数是从客户端代码中需要传递到服务器段的参数的变量名。第三个参数是处理服务器端返回给客户端处理结果后,客户端处理返回值的函数名。第四个参数是context变量的变量名。最后一个参数是,在回调过程中如果在服务器端发生异常,在客户端接受异常信息并处理该信息的函数名。<o:p></o:p>
<o:p> </o:p>
对于客户端的实现,需要在客户端代码中定义传参的变量,定义context变量,并且以<%...%>的方式访问服务器端变量,以调用服务器段的Page.GetCallbackEventHandler()方法。当调用Page.GetCallbackEventHandler方法时,客户端代码中的<%...%>部分会被替换成对__doCallback()客户端函数的调用。__doCallback函数是.Net Framework 2.0内置的一个javascript函数,作用是产生一段通过XMLHTTP方式对服务器端代码的调用。__doCallback函数的参数是同服务器端的GetCallbackEventHandler被调用时的参数完全一致。<o:p></o:p>
<o:p> </o:p>
客户端的context变量是一个很有趣的东西。在整个回调过程中,context变量都被浏览器缓存起来,而且不被发送到服务器端。context变量是由开发员设计的,它的作用是在多次回调间对不同的回调起标识作用。在客户端的处理服务器处理结果返回值的函数里,只需要判断context变量的自定义属性,就可以得到关于回调的标识信息。<o:p></o:p>
<o:p> </o:p>
客户端的实现包括:若干个初始化回调的函数、一个处理回调返回值的函数、和一个处理回调异常的函数。第二个函数的两个参数分别是服务器端返回值的字符串和context变量。第三个函数的参数分别是服务器端的异常信息和context变量。
<o:p>
Client Callback的调用顺序,首先通过调用GetCallbackEventHandler将客户端代码里的<%...%>表达式转化为__doCallback函数的调用。第二步,初始化回调时,通过__doCallback将要传递的参数发送给服务器端的RaiseCallbackEvent方法。第三步,回调结束,RaiseCallbackEvent的返回值传到客户端代码的对应函数处理。如果回调有异常,则通过客户端的错误处理函数处理。<o:p></o:p>
</o:p>
4> Client Callback小结<o:p></o:p>
<o:p> </o:p>
不是所有的浏览器都支持Client Callback,因此可能需要使用.Net Framework 2.0新增的两个属性:SupportsCallback和SupportsXmlHttp。这两个属性都在Request.Browser下面。现在当然所有的浏览器对这两个属性的返回值都是一样的,或者全true,或者全false。之所以要设这两个属性,是为了将来的扩展。也许,以后的Client Callback不是用XmlHttp实现的呢:)<o:p></o:p>
<o:p> </o:p>
Client Callback通过XmlHttp,其实是对服务器的另一个同名页面的请求和处理。因此,使用Client Callback的时候要很小心。首先不要在服务器端代码里试图取控件的值,因为这是在另一个页面里处理,此时取得的不是当前页面的当前值。也就是说,不要使用从客户端传递的参数以外的任何值。其次,由于整个回调过程都没有将当前的表单提交,因此,要小心的维护页面的ViewState或者Session值。
发表评论
-
入职第一天
2004-07-12 20:20 545很喧闹的一天新人训。当然,可以说是激情四射,或者说是嘈杂无聊。 ... -
迎接部门训
2004-07-13 18:07 502今天开始迎接部门的专业训了,C#、SQL Server、数据库 ... -
生活的颜色
2004-07-14 18:57 570一个诚实的裁判就这样慷慨赴义了,很多很多黑暗中的裁判们却还好端 ... -
历史的沉思
2004-07-16 12:43 631很久以前的一篇文章, ... -
选择的未来
2004-07-17 15:11 480先提一个问题:做一个技术员,技术能力重要还是业务知识重要?再提 ... -
统一的困惑
2004-07-19 20:45 524RUP(Rational统一过程)的基本开发方式是迭代。需求迭 ... -
开发的效率
2004-07-21 17:44 525面对多人协同开发的分层系统,有两种开发方式:其一、一人负责一到 ... -
模型或模式
2004-07-22 23:27 634不论是吵吵嚷嚷的软件工程、XP建模,还是死灰复燃的MDA、一心 ... -
对象的效率
2004-07-28 21:22 531面向对象带来方便的同时亦带来很多的问题。类的继承在扩展的同时也 ... -
泪写的文章
2004-07-29 20:20 506今天我又哭了。一个月前,我还觉得哭于我是很遥远的事情。甚至,我 ... -
期待的精彩
2004-07-31 11:08 526好久好久没有看到国足这么酣畅的胜利了,好久好久没有体会到看球的 ... -
转载的文章
2004-08-01 10:50 497今天转载一篇吧,记录一段可笑的过往。 别了,Dr.Dobb's ... -
TDD 心得
2004-08-03 16:19 776一直觉得,近年来,真正有意义的技术或者思想只有两个:Refac ... -
近期的任务
2004-08-06 12:54 5711、Test Driven Development2、Java ... -
上海印象一
2004-08-09 22:28 552车一进入上海,扑面而来的就是一片一片的高楼,黑压压地便压了过来 ... -
上海印象二
2004-08-10 21:19 510上海当然是天堂,但也是仅对一部分人一部分地区。对大多数人大部分 ... -
转载的文章
2004-08-13 23:38 445O/R Mapping中的继承~ http://www.cnb ... -
生日的祝福
2004-08-15 10:49 700今天是agate的生日。尽管这句话已经被用得很俗,不过我还是想 ... -
等爱的狐狸
2004-08-27 18:16 556“对我来说,你还只是一个小男孩,就像其他千万个小男孩一样。我不 ... -
飞翔的寓言
2004-08-30 20:58 502我才发现梦想与现实间的差别逆着风让自己体验每一个感觉就像是寓言 ...
相关推荐
ASP.NET 2.0客户端回调技术是Web应用程序中一种提高用户体验的方法,它允许页面部分更新而无需进行完整的页面刷新。这种技术在不打断用户交互的情况下提供了更快的响应速度,极大地提升了网页应用的性能和效率。在...
客户端无刷新回调是一种提高Web应用用户体验的技术,它允许在不重新加载整个页面的情况下与服务器进行交互,从而更新部分页面内容。这种技术的核心是利用JavaScript和服务器端的特定接口协同工作,其中.NET框架提供...
客户端回调技术是Web开发中的一个重要概念,它允许服务器在不刷新整个页面的情况下更新部分网页内容,从而提升用户体验。在ASP.NET 2.0中,客户端回调功能主要通过UpdatePanel控件实现,它是ASP.NET AJAX...
ASP.NET 客户端回调(Client Callback)是一种技术,它允许网页部分更新,而无需整个页面刷新,类似于AJAX(Asynchronous JavaScript and XML)的工作原理。这种技术提高了用户体验,因为用户在等待数据加载时可以...
ASP.NET 2.0客户端回调技术是微软在Web开发领域引入的一种创新机制,它允许Web应用程序在不重新加载整个页面的情况下与服务器进行交互,提高了用户体验并降低了网络带宽的消耗。这种技术的核心在于Asynchronous Page...
在ASP.NET 2.0中,引入了一种新的技术,即客户端回调(Client Callback)机制,也称为 Partial Page Rendering 或 UpdatePanel,这使得开发者能够实现无刷新页面更新,提高用户体验。 客户端回调机制的核心是通过...
在探讨ASP.NET 2.0如何使用Ajax实现客户端回调功能之前,我们首先简要回顾一下ASP.NET 2.0和Ajax的基本概念。 ### ASP.NET 2.0简介 ASP.NET 2.0是Microsoft推出的一个用于开发Web应用程序的框架,它是.NET ...
通过查看这些文件,你可以更深入地了解如何在实际项目中运用AIDL实现多进程通信及客户端回调。学习和熟练掌握AIDL,对于开发复杂的Android应用程序,尤其是涉及到跨进程交互的场景,是非常重要的。
在这个特定的源代码库中,我们看到的是一个利用HttpModule实现Ajax客户端回调处理的实例。让我们深入了解一下这个技术及其应用场景。 1. **HttpModule的基本概念** HttpModule是ASP.NET中的一类特殊组件,它们可以...
在VS2010下开发,包含了源码和发布后的服务端文件、客户端程序。Demo使用了应答模式、双工模式进行最简单的服务端通信,服务端架设IIS6.0上,客户端用Winform。本人也是初学WCF,感觉学习WCF还是有点曲折,希望对...
- `TDSClientCallbackChannelManager`:这个组件是DataSnap客户端的核心,用于向服务器注册客户端回调。通过设置`ChannelName`,`CommunicationProtocol`(通常是TCP/IP),`DSHostname`和`DSPort`,客户端可以指定...
在 ASP.NET 中,客户端回调是一种优化网页交互的技术,允许页面的部分内容更新而无需完整刷新。这种技术提高了用户体验,因为减少了网络通信的开销。本文将详细介绍如何在 ASP.NET 网页中实现客户端回调,包括回调...
`Callback`接口定义了客户端回调函数的规范,即服务端可以调用的函数原型。在本例中,`Callback`接口只有一个方法`c1()`,服务端`F`在完成任务后调用`mCallback.c1()`来执行回调。 具体实现如下: 1. 定义一个回调...
在ASP.NET Web Forms中,客户端回调(Client Callbacks)是实现页面与服务器之间异步通信的一种方式,无需完整刷新整个页面。这种技术提高了用户体验,因为只有部分页面内容会更新,而不是整个页面。 在提供的示例...
// 定义客户端回调和服务器回调类型 typedef void (*client_cb)(char *); typedef void (*server_cb)(char *); // 服务器端函数,接受客户端的回调函数 void ServerFunction(client_cb client_callback) { // 处理...
在构建时直接从 browserify 客户端回调调用 node.js(服务器端) 用法 npm install browserify-inline --save-dev gulpfile.js // ... bundler . transform ( 'browserify-inline' ) ; // ... some-client-file....
3. 服务器保存客户端回调接口的引用,并在需要时调用相应方法。 在`StockQuote`接口中,可能有一个`updateQuote`方法,服务器在接收到新的股票价格时,会调用这个方法。`StockQuoteClient`类中则会有一个实现了`...
易语言Socket5客户端连接源码
该方法应包含触发客户端回调的逻辑,并准备接收客户端返回的结果。 - **客户端端**:在客户端应用程序中,创建连接到服务器的TDSClientConnection对象,并注册回调方法。当服务器调用此方法时,客户端代码将被执行...