深入Atlas 系列之客户端支持 3
点击次数:22 次 发布日期:2008-11-26 11:12:41 作者:源代码网
|
源代码网推荐 源代码网推荐 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)。 源代码网推荐 源代码网供稿. |
