上一部分说道在发送前,已经将回调函数赋值成

xmlRequest.onreadystatechange=WebForm_CallbackComplete;

那么咱们就先来看看这个callback方法。

functionWebForm_CallbackComplete(){
for(i=0; i<__pendingCallbacks.length; i++){
        callbackObject
=__pendingCallbacks[i];
if(callbackObject&&callbackObject.xmlRequest&&(callbackObject.xmlRequest.readyState==4)){
            WebForm_ExecuteCallback(callbackObject);
if(!__pendingCallbacks[i].async){
                __synchronousCallBackIndex
=-1;
            }
            __pendingCallbacks[i]=null;
varcallbackFrameID="__CALLBACKFRAME"+i;
varxmlRequestFrame=document.getElementById(callbackFrameID);
if(xmlRequestFrame){
                xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);
            }
        }
    }
}

这是获得一个挂起的未处理回调队列,并且如果队列里面的是以xmlrequest发送的ajax的请求,而且状态为4的话,那么调用方法:WebForm_ExecuteCallback方法。
当然如果是通过iframe来发送ajax请求的话,那么就是将先前的iframe移除掉。
下一部分就是WebForm_ExecuteCallback方法:

functionWebForm_ExecuteCallback(callbackObject){
varresponse=callbackObject.xmlRequest.responseText;
if(response.charAt(0)=="s"){
if((typeof(callbackObject.eventCallback)!="undefined")&&(callbackObject.eventCallback!=null)){
            callbackObject.eventCallback(response.substring(
1), callbackObject.context);
        }
    }
elseif(response.charAt(0)=="e"){
if((typeof(callbackObject.errorCallback)!="undefined")&&(callbackObject.errorCallback!=null)){
            callbackObject.errorCallback(response.substring(
1), callbackObject.context);
        }
    }
else{
varseparatorIndex=response.indexOf("|");
if(separatorIndex!=-1){
varvalidationFieldLength=parseInt(response.substring(0, separatorIndex));
if(!isNaN(validationFieldLength)){
varvalidationField=response.substring(separatorIndex+1, separatorIndex+validationFieldLength+1);
if(validationField!=""){
varvalidationFieldElement=theForm["__EVENTVALIDATION"];
if(!validationFieldElement){
                        validationFieldElement
=document.createElement("INPUT");
                        validationFieldElement.type
="hidden";
                        validationFieldElement.name
="__EVENTVALIDATION";
                        theForm.appendChild(validationFieldElement);
                    }
                    validationFieldElement.value=validationField;
                }
if((typeof(callbackObject.eventCallback)!="undefined")&&(callbackObject.eventCallback!=null)){
                    callbackObject.eventCallback(response.substring(separatorIndex
+validationFieldLength+1), callbackObject.context);
                }
            }
        }
    }
}

这部分就是返回的值如果是以e开头的话调用异常方法,证明服务器端出错,如果以's'开头或者存在'|'字符的话,那么就调用回调成功的方法,如果以'e'开头的话那么就调用错误处理方法,如果你注册了的话。

在实际的测试中,我改变几种策略来揣摩它的机制:
服务器端直接抛出异常:结果用抓包工具观察到果然是返回'e'。
public String GetCallbackResult() 方法直接response.write一个字符串,但是却不返回数据,并catch住当前模块,目的是想直接输出某些东西,并且绕过它自有的实现机制,比如自由控制异常与否,自由控制异常,但是结果抓包显示:e正在中止线程。也就是说response.write使得当前线程终止了,这个异常被它捕获到并且返回给了客户端。
另外一个变通:将服务器重定向。

publicString GetCallbackResult()
{
     
try{
            Response.Redirect(
"http://www.163.com");
//Response.Write("asd");Response.End();

        }
catch{ }finally{

        }
return"";
    }

这样的话,跟踪到的结果确是 0| 也就是说看起来正常。前一种测试它能捕获到异常,说明客户端回调的回调结果处理应该在response.end之后,那么应该就是在endrequest这个阶段做的回调结果返回的处理。(没有记错的话beginrequest是模块里面最后一个了。)而redirect方法(304重定向)却不会触发这个事件,所以服务器端没有捕获到而只是返回了结果。

好了,整个已经研究完了,我想来说点感想,首先是这个做得是比较完美,如果不支持xmlrequest对象,还采用了iframe的形式来进行支持,不过多写了好多代码.......另外是否能将其优化为在服务器端智能判断客户端的浏览器类型,然后输出js文件呢?不支持xmlrequest对象的浏览器应该能从客户端发送过来的客户端环境变量中检索出来,并且让各客户端各取所需,那样不是很好吗?这样就不会造成在ie和ff浏览器99% 份额的时候为了1%而不必要做了如下的冗余措施:
在浏览器尚未加载完的时候调用WebForm_InitCallback将页面所有的控件和值作为键值对存储起来,并将其encode。这个操作显得非常多余。而且浪费时间和资源。
同时也看到了asp.net发送了很多与之无关的代码都发送了过来,比如只有在MaintainScrollPositionOnPostback为true的时候才需要的代码,以及页面上有Defaultbutton的时候才有的代码等等,都一股脑全部过来了。实在是有些浪费资源。另外看到asp.net的js脚本代码写的也不是很省,比如这段:

varcallback=newObject();
    callback.eventCallback
=eventCallback;
    callback.context
=context;
    callback.errorCallback
=errorCallback;
    callback.async
=useAsync;

可以改成:

varcallback={eventCallback:eventCallback,context:context,errorCallback:errorCallback,async:useAsync}

这在prototype框架中经常见到,这样写避免了使用with语句来消耗资源,也减少了很多代码,节省了字节数。

所以asp.net在快速开发这一块的确是非常好,但是也封装了不少东西,在企业级的应用当中,要想获得更好的性能还是只有自己手写不少代码,来弥补性能,当然,asp.net也留下了不少可扩展的空间,只要你熟悉它的机制。
下一篇文章我帖一下我这次收获的其他东西。

错误有所难免,希望大侠们指教!

转载于:https://www.cnblogs.com/silverlighter/archive/2007/07/26/831645.html

asp.net 客户端回调功能的实现机制探讨(响应部分及可能的优化)相关推荐

  1. 浅谈ASP.NET客户端回调

    最近同学要做一个项目,需求是:音乐播放器.大致UI如图: 点击右边的"X"图标,可以删除当前选定的这首歌.因为现实界面的代码是复制过来的,并且前辈使用的是拼接字符串,然后绑定到页面 ...

  2. ASP.NET 2.0 正式版中无刷新页面(客户端回调)的开发

    在已经发布的 ASP.NET2.0 中,无刷新页面开发相关部分同 beta2 有不少改动.而且在越来越多的 Ajax 开发包被开发出来的情况下, ASP.NET2.0 自带的无刷新页面技术没有被很多人 ...

  3. 在 ASP.NET 网页中不经过回发而实现客户端回调

    一.使用回调函数的好处 在 ASP.NET 网页的默认模型中,用户会与页交互,单击按钮或执行导致回发的一些其他操作.此时将重新创建页及其控件,并在服务器上运行页代码,且新版本的页被呈现到浏览器.但是, ...

  4. ASP.NET无刷新客户端回调

    首先说一下:Page.ClientScript 用于管理脚本.注册脚本和向页添加脚本. 返回结果:一个 System.Web.UI.ClientScriptManager 对象. ClientScri ...

  5. ASP.NET2.0实现无刷新客户端回调

    Asp.Net2.0的客户端回调是一种很让人激动的方法,他能够让我们控制要提交什么数据给服务器而不用提交整个页面,同时服务器也只返回你所需要的数据而不要发回整个页面. 首先我们要说一个很重要的方法:G ...

  6. 利用DataSnap的回调功能在客户端显示服务器方法的执行进度

    如果DataSnap服务器方法的执行时间比较长,这时候可能需要在客户端用进度条显示当前服务器方法的执行进度.要实现这种需求,现在可以利用DataSnap的回调功能,此功能是从Delphi 2010版本 ...

  7. 服务器响应回调函数,解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)...

    由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...

  8. ASP.Net 2.0窗体身份验证机制详解(FormsAuthentication) (转载)

    ASP.Net 2.0窗体身份验证机制详解(FormsAuthentication) 收藏 转自:http://www.aspxclub.com/l12/c_3689.html 本篇文章介绍了在ASP ...

  9. ASP.NET MVC:缓存功能的设计及问题

    ASP.NET MVC:缓存功能的设计及问题 这是非常详尽的asp.net mvc中的outputcache 的使用文章. [原文:陈希章 http://www.cnblogs.com/chenxiz ...

最新文章

  1. 推荐7款超良心的windows软件,每一个都是精品!
  2. TypeError: Input 'b' of 'MatMul' Op has type float32 that does not match type int32 of argument 'a'.
  3. CPU性能监控之一------CPU架构
  4. 脸红是因为缺乏乙醛分解酶导致的酒精中毒
  5. 全国计算机等级考试二级教程——公共基础知识(2013年版)pdf,全国计算机等级考试2级教程:公共基础知识(2013年版)...
  6. 学习Java的十大理由,益处太多了
  7. Tensorflow解决MNIST手写体数字识别
  8. 净水器怎么放_家中安装净水器后,水却更脏了!这几个常识性问题你不得不知道...
  9. cesium html源码,Cesium源码的本地运行及调试
  10. java获取网络带宽_Linux Java 获取CPU使用率,内存使用率,磁盘IO,网络带宽使用率等等...
  11. python读取配置文件 ConfigParser
  12. go修改服务器时间,Windows 配置时间同步服务器以及配置时间同步间隔
  13. Django复习:模型与管理网站
  14. nvm 下载node 下载不下来_软件 | 度盘不限速,短视频超清无水印下载,*力解析下载,资源库丰富...
  15. Winform中ComcoBox控件设置选定项
  16. springBoot入门第一章springBoot第一个程序
  17. L3G4200D + ADXL345 卡尔曼滤波
  18. 什么是web前端技术?要学什么?
  19. 万字长文保姆级教你制作自己的多功能QQ机器人
  20. 缺少包含@author的注释信息解决方法

热门文章

  1. 前端面试高频考点,ES6知识点汇总!!!
  2. Vue项目—请求函数的封装
  3. 六级词汇打卡第三天(三)
  4. mac php5.6 gd 扩展,mac 编译安装php5.6.40
  5. by mybatis 自定义order_springboot2结合mybatis拦截器实现主键自动生成
  6. 手机忽然就安装不了东西,就是下载好apk打开后按不了安装。怎么处理?
  7. erp软件是什么软件
  8. 2021年是“三蛇闹春,十鼠抢粮,十一牛耕田”,啥意思?
  9. 新媒体增长方法从哪里找?
  10. 5个层次的赚钱模式,看看你是哪一种?