本文介绍ASP.NET AJAX提供的类已经足够大多数应用的需求,但是在某些特殊情况,可能需要做一些改变。

ASP.NET AJAX的许多功用会要求异步地拜访服务器端,例如拜访Web Services,Authentication/Profile Services(事实上和拜访Web Services是相同的机制)和Partial Rendering。在ASP.NET AJAX中,一切的这些拜访都是经过一个网络拜访的根底结构来完结的,无一例外。

浅析ASP.NET AJAX(浅析和浅谈的区别论文)  ASP.NET AJAX 第1张

一般来说,ASP.NET AJAX供给的类现已满意大多数运用的需求,可是在某些特殊情况,或许需求做一些改动。因而,Network Communication Layer供给了必定程度上的扩展才能——经过供给自定义的WebRequestExecutor子类来替换默许设置:XMLHttpExecutor。这种改动能够运用于一个独自的WebRequest,也能够对大局进行一个设置。这个咱们就能关于客户端的行为做一些简略的修正和弥补。这样能够说是 Network Communication Layer仅有的“官方”扩展点,其实才能有限。至于运用一些灵敏的办法从JavaScript言语特性能上进行的修正,在这儿就忽略不计了。

这样咱们就能关于客户端的行为做一些简略的修正和弥补。那么假如对其进行很多的修正会怎么样?假如这种修正确实能够满意您的需求,当然能够。可是这样的话,Partial Rendering就很或许无法完成了。Partial Rendering的作法是在客户端和服务器端产生一个谨慎的协议,用来传递和处理很多的数据。假如有任何改动被加诸于这些数据上,协议就被破坏了,这个能够说是ASP.NET AJAX的最重要的功用之一的控件也就失效了。

接下来,咱们具体了解一下这整个流程的每个进程。

一、创立Sys.Net.WebRequest

这是建议一个服务器恳求的***步。首要树立一个Sys.Net.WebRequest目标,然后经过addHeader,set_url等办法设置这个恳求的各个信息,然后调用add_complete办法来注册complete事情。请留意,这和CTP版其他Sys.Net.WebRequest不同。在CTP版其他Sys.Net.WebRequest中,存在着三个事情:complete,timeout和aborted,用户能够有挑选地注册这些事情。在RTM的Sys.Net.WebRequest中,三个事情被合成了一个complete事情。不论这个Request的成果怎么,都会在这个触发这个事情,用户需求在呼应这个事情的办法里自行依据得到的Response的信息来分辩这个恳求的情况。具体的判别办法稍后再进行阐明。在创立完 WebRequest目标后,将调用它的invoke办法履行这个恳求。一个WebRequest目标只能被 invoke一次。

二、将WebRequest目标交给WebRequestManager履行

在WebRequest目标的invoke办法被调用今后,它会调用 “Sys.Net.WebRequestManager.executeRequest(this)”将本身交给大局的 WebRequestManager履行。这儿的WebRequestManager其实是Sys.Net._WebRequestManager类的实例。在初始化环境的时分,就会将这个类实例化一个目标,赋值到Sys.Net.WebRequestManager变量中,以一个Singleton的形象供其他办法调用。它会在处理Request的进程中在特定的时间触发一些事情,用户能够依托呼应这些事情来改动Request的行为,例如阻挠特定的 Request,或许改动Request的一些特色等等。

乍看下来,RTM版别中的WebRequestManager和CTP中的 WebRequestManager没有很大的差异嘛(引入了几个事情在外)。事实上,个人认为在这个方面Atlas打了自己一个耳光。在CTP版其他 WebRequestManager中,关于办理WebRequest有一套比较复杂的办法,其理由是能够更好有利地势用好浏览器的资源,以进步 WebRequest的功率。这便是Atlas对外一向宣称的“Client Request Stack”,这一点被当作Atlas的重要特色来看待。不过这一点在RTM版别中被撤销了,新的WebRequestManager在处理一个 WebRequest目标的时分仅仅是触发事情,然后简略地运用Executor来调用这个WebRequest目标。

下面列举了调用了executeRequest办法后的要害逻辑:
1. 查看WebRequest是否指定了WebRequestExecutor(这能够在结构WebRequest的时分指定)。
2. 假如WebRequest没有指定WebRequestExecutor,则运用set_executor办法分配默许的WebRequestExecutor
3. 结构Sys.Net.NetworkRequestEventArgs参数目标,触发WebRequestManager的invokingRequest事情。
4. 假如Sys.Net.NetworkRequestEventArgs目标的cancel特色为true,撤销履行Request。
5. 调用executor目标的executeRequest办法,以履行Request。

三、WebRequestExecutor履行Request

在这儿,以ASP.NET AJAX的默许WebRequestExecutor类:XMLHttpExecutor为例进行阐明。在XMLHttpExecutor的 executeRequest办法被调用后,XMLHttpExecutor会结构一个XMLHttpRequest目标,并依据WebRequest的各项特色设定XMLHttpRequest的目标,并指定XMLHttpRequest目标的onreadystatechange为本身的私有办法 _onReadyStateChange。调用了executeRequest办法后的要害逻辑如下:
1. 结构XMLHttpRequest目标,并依据WebRequest目标的特色设定它的各项特色。
2. 运用window.setTimeout用于监听超时产生。
3. 调用XMLHttpRequest的send办法。

在timeout的呼应办法中调用XMLHttpRequest的abort办法,并调用WebRequest的complete办法。在 _onReadyStateChange办法中铲除监听timeout的Timer,并调用complete办法。当然,这仅仅个简略的描绘,事实上还需求对Executor的特色进行设定。咱们将鄙人篇文章中将对此进行具体评论。在complete办法被调用后要害逻辑如下:
1. 触发WebRequestManager的completedRequest事情。
2. 触发WebRequest的complete事情。

四、用户呼应WebRequest的complete事情

在呼应WebRequest的complete事情时,需求关于所取得的成果进行判别,以确认这个Request的成果究竟怎么,是成功了,仍是出错了,亦或是过期了?需求留意的是,咱们尽管监听的是WebRequest目标的事情,可是回调函数的***个参数是WebRequestExecutor目标!executor目标在这儿事实上应该被看作是一个response。咱们就来简略看一下应该怎么依据executor目标的特色来判别 Request的成果吧。为了关于这部分逻辑有简略而明晰的描绘,我就运用代码片断来阐明吧。代码结构如下:

  1. functiononComplete(response,eventArgs){
  2. if(response.get_aborted()){
  3. //Abort
  4. }
  5. elseif(response.get_responseAvailable()){
  6. varstatusCode=response.get_statusCode();
  7. if(((statusCode<200)||(statusCode>=300))){
  8. //Error
  9. }
  10. else{
  11. //Success
  12. }
  13. }
  14. else{
  15. if(response.get_timedOut()){
  16. //Timeout
  17. }
  18. else{
  19. //Error
  20. }
  21. }
  22. }

这便是判别一个Request成果的逻辑结构了,十分明晰。阅读过ASP.NET AJAX客户端代码的朋友们能够发现,在RTM版别中这段逻辑不只一次呈现过。咱们假如需求直接运用WebRequest目标时,也应该运用这个逻辑进行判别。

到这儿,咱们应该现已搞清楚了从一个WebRequest目标被结构出来今后,是怎么经过WebRequestManager和 WebRequestExecutor而履行的,之间会触发哪些事情,而***又是怎么经过Response(WebRequestExecutor)目标来取得Request的成果。鄙人一篇文章中,咱们将经过剖析WebRequestExecutor、XMLHttpExecutor以及相关类的完成,来了解应该怎么自定义和运用一个WebRequestExecutor。

【修改引荐】

  1. ASP.NET MVC Web运用程序工程
  2. IIS6的ASP.NET ISAPI恳求处理进程
  3. ASP.NET控件的七种用户办理相关控件
  4. 对ASP.Net进行RSA加密
  5. ASP.NET得到数据库字符串的办法
转载请说明出处
知优网 » 浅析ASP.NET AJAX(浅析和浅谈的区别论文)

发表评论

您需要后才能发表评论