当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  深入Atlas 系列之客户端支持 3

 深入Atlas 系列之客户端支持 3

点击次数:22 次 发布日期:2008-11-26 11:12:41 作者:源代码网
源代码网推荐      在创建了Sys.net.WebRequest对象后,并不是将用户传入的那些回调函数直接注册给它的事件,而是使用了Sys.Net.WebMethod里的onXXXX,进行了进一步的处理,代码如下:
源代码网推荐  
源代码网推荐    onXXX函数分析:
源代码网推荐  
源代码网推荐  1 function onComplete(response, eventArgs) {
源代码网推荐  2  // 获得Status Code
源代码网推荐  3  var statusCode = response.get_statusCode();
源代码网推荐  4
源代码网推荐  5  var result = null;
源代码网推荐  6
源代码网推荐  7
源代码网推荐  8  try {
源代码网推荐  9   // 尝试将Data序列化成对象
源代码网推荐  10  result = response.get_object();
源代码网推荐  11 }
源代码网推荐  12 catch (ex) { // 失败了,说明不是传出对象
源代码网推荐  13  try {
源代码网推荐  14   // 获得XML
源代码网推荐  15   result = response.get_XML();
源代码网推荐  16  }
源代码网推荐  17  catch (ex) { }
源代码网推荐  18 }
源代码网推荐  19
源代码网推荐  20 // 如果没有成功(statusCode不是2XX),或者
源代码网推荐  21 // result为Sys.Net.MethodRequestError类型,
源代码网推荐  22 // 表示Web Services出错了(例如抛出了Exception)
源代码网推荐  23 if (((statusCode < 200) || (statusCode >= 300)) ||
源代码网推荐  24 Sys.Net.MethodRequestError.isInstanceOfType(result)) {
源代码网推荐  25
源代码网推荐  26  // 如果提供了onMethodError回调函数,那么执行
源代码网推荐  27  if (onMethodError) {
源代码网推荐  28   onMethodError(result, response, userContext);
源代码网推荐  29  }
源代码网推荐  30  else {
源代码网推荐  31   // 没有提供onMethodError的话那么就Trace
源代码网推荐  32   debug.trace("The server method "" + methodName + "" failed with the following error:");
源代码网推荐  33
源代码网推荐  34   if (result != null) {
源代码网推荐  35    debug.trace(result.get_exceptionType() + ": " + result.get_message());
源代码网推荐  36   }
源代码网推荐  37   else {
源代码网推荐  38    debug.trace(response.get_data());
源代码网推荐  39   }
源代码网推荐  40  }
源代码网推荐  41 }
源代码网推荐  42 else if (onMethodComplete) { // 调用成功了
源代码网推荐  43  // 如果提供了onMethodComplete回调函数,那么执行
源代码网推荐  44  onMethodComplete(result, response, userContext);
源代码网推荐  45 }
源代码网推荐  46 }
源代码网推荐  47
源代码网推荐  48 function onTimeout(request, eventArgs) {
源代码网推荐  49  if (onMethodTimeout) {
源代码网推荐  50   onMethodTimeout(request, userContext);
源代码网推荐  51  }
源代码网推荐  52 }
源代码网推荐  53
源代码网推荐  54 function onAborted(request, eventArgs) {
源代码网推荐  55  if (onMethodAborted) {
源代码网推荐  56   onMethodAborted(request, userContext);
源代码网推荐  57  }
源代码网推荐  58 }
源代码网推荐  
源代码网推荐    在onComplete方法中,会查看status code。在HTTP 1.x中,2xx代表了Success(关于完整Status Code的描述,请参考http://www.w3.org/Protocols/HTTP/HTRESP.html)。由此可以得知该如何调用用户提供的回调函数。在调用回调函数时会将用户提供的userContext作为参数传入,这种做法在异步调用中被经常使用,例如.NET Framework中Delegate的异步调用。
源代码网推荐  
源代码网推荐    至此,Sys.Net.WebMethod就被解释完了,并不复杂,甚至我觉得我的解释有些累赘。不过它提供的方法非常重要,是客户端访问服务器端函数的核心(客户端方面)。而调用Web Services,则需要Sys.Net.ServiceMethod这个Sys.Net.WebMethod的子类来提供那五个抽象函数的具体实现,分析如下:
源代码网推荐  
源代码网推荐    Sys.Net.ServiceMethod代码分析:
源代码网推荐  
源代码网推荐  1 // 如果要访问的Web Services是http://www.sample.com/abc/ws.amsx中
源代码网推荐  2 // HelloWorld方法的话,则
源代码网推荐  3 // url:Web Services的地址,以上例为"/abc/ws.amsx"
源代码网推荐  4 // methodName:方法名,以上例为"HelloWorld"
源代码网推荐  5 // appUrl:该Web应用程序的URL,以上例(可能,也有可能不是)为"http://www.sample.com/"
源代码网推荐  6 Sys.Net.ServiceMethod = function(url, methodName, appUrl) {
源代码网推荐  7 Sys.Net.ServiceMethod.initializeBase(this);
源代码网推荐  8
源代码网推荐  9 this.get_methodName = function() { return methodName; }
源代码网推荐  10
源代码网推荐  11 // header:一个以Dictionary,用key - value的方式
源代码网推荐  12 // 表示Header的对象,Object类型
源代码网推荐  13 this.addHeaders = function(headers) {
源代码网推荐  14  // Content-Type设为"application/json",
源代码网推荐  15  // 表示要通过JSON方式来传递数据
源代码网推荐  16  headers["Content-Type"] = "application/json";
源代码网推荐  17 }
源代码网推荐  18
源代码网推荐  19 // param:一个Dictionary,用key - value的方式
源代码网推荐  20 // 保存即将传递给Web Services的参数。
源代码网推荐  21 // useGetMethod:是否使用HTTP GET方法,Boolean类型
源代码网推荐  22 this.get_url = function(params, useGetMethod) {
源代码网推荐  23  // 如果不是用HTTP GET方法,或者没有提供params,
源代码网推荐  24  if (!useGetMethod || !params)
源代码网推荐  25  {
源代码网推荐  26   // 将params设为空对象,params将被作为Query String添加在
源代码网推荐  27   // URL上,自然使用HTTP POST方法时不需要那些Query String
源代码网推荐  28   params = {};
源代码网推荐  29  }
源代码网推荐  30
源代码网推荐  31  // 添加一个mn,值为methodName,
源代码网推荐  32  // 这句代码等价于params["mn"] = methodName;
源代码网推荐  33  params.mn = methodName;
源代码网推荐  34  // 调用Sys.Net.WebRequest.createUrl方法获得url,
源代码网推荐  35  // 将params作为Query String放在url后。
源代码网推荐  36  // 在这里,正常情况下只有mn一个参数。
源代码网推荐  37  var fullUrl = Sys.Net.WebRequest.createUrl(url, params);
源代码网推荐  38  // 删除mn
源代码网推荐  39  delete params.mn;
源代码网推荐  40  return fullUrl;
源代码网推荐  41 }
源代码网推荐  42
源代码网推荐  43 this.get_body = function(params, useGetMethod) {
源代码网推荐  44  // 如果使用HTTP GET方法,则不用body
源代码网推荐  45  if (useGetMethod) return null;
源代码网推荐  46
源代码网推荐  47  // 将params序列化作为body
源代码网推荐  48  var body = Sys.Serialization.JSON.serialize(params);
源代码网推荐  49
源代码网推荐  50  // 如果是空对象,则返回空body。
源代码网推荐  51  if (body == "{}") return "";
源代码网推荐  52
源代码网推荐  53  return body;
源代码网推荐  54 }
源代码网推荐  55
源代码网推荐  56 this.get_appUrl = function() {
源代码网推荐  57  return appUrl;
源代码网推荐  58 }
源代码网推荐  59 }
源代码网推荐  60 Sys.Net.ServiceMethod.reGISterClass("Sys.Net.ServiceMethod", Sys.Net.WebMethod);
源代码网推荐  
源代码网推荐    对于传入参数url和appUrl,可能需要重新解释一下。如果url传入的是相对路径,则appUrl可以为null。
源代码网推荐    做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华