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

时间:2010-03-11 11:37:10  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:p;  for (i = 0; i < __pendingCallbacks.length; i++) {    callbackObject = __pendingCallbacks[i];    if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {    WebForm_ExecuteCallback(callbackObject);    if (!__pendingCallbacks[i]....
  正文:上一部分说道在发送前,已经将回调函数赋值成
  xmlRequest.onreadystatechange = WebForm_CallbackComplete;
  那么咱们就先来看看这个callback方法。
  function WebForm_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;
   var callbackFrameID = "__CALLBACKFRAME" + i;
   var xmlRequestFrame = document.getElementById(callbackFrameID);
   if (xmlRequestFrame) {
   xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);
   }
   }
   }
  }
  这是获得一个挂起的未处理回调队列,并且如果队列里面的是以xmlrequest发送的ajax的请求,而且状态为4的话,那么调用方法:WebForm_ExecuteCallback方法。
  当然如果是通过iframe来发送ajax请求的话,那么就是将先前的iframe移除掉。
  下一部分就是WebForm_ExecuteCallback方法:
  function WebForm_ExecuteCallback(callbackObject) {
   var response = callbackObject.xmlRequest.responseText;
   if (response.charAt(0) == "s") {
   if ((typeof(callbackObject.eventCallback) != "undefined") && (callbackObject.eventCallback != null)) {
   callbackObject.eventCallback(response.substring(1), callbackObject.context);
   }
   }
   else if (response.charAt(0) == "e") {
   if ((typeof(callbackObject.errorCallback) != "undefined") && (callbackObject.errorCallback != null)) {
   callbackObject.errorCallback(response.substring(1), callbackObject.context);
   }
   }
   else {
   var separatorIndex = response.indexOf("|");
   if (separatorIndex != -1) {
   var validationFieldLength = parseInt(response.substring(0, separatorIndex));
   if (!isNaN(validationFieldLength)) {
   var validationField = response.substring(separatorIndex + 1, separatorIndex + validationFieldLength + 1);
   if (validationField != "") {
   var validationFieldElement = 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'。

"asp.net 客户端回调功能的实现机制探讨(响应部分及可能的优化)"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Programming/aspnet/13189.html


关键字:

关于《asp.net 客户端回调功能的实现机制探讨(响应部分及可能的优化)》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td