lith hace 3 años
padre
commit
45a3bb4409

+ 76 - 73
dotnet/ServiceCenter/App.Gover.Gateway/wwwroot/JsStation/JsStation.html

@@ -3,7 +3,7 @@
 <html lang="zh-cn" xmlns="http://www.w3.org/1999/xhtml">
 <head>
     <meta charset="utf-8" />
-    <title>Sers-JsStation</title>   
+    <title>Sers-JsStation</title>
 
 </head>
 <body>
@@ -28,43 +28,38 @@
                 <td>
                     <textarea type="text" id="txt_apiNodes" rows="30" cols="80">
 [
-
-{
-    route: '/JsStation/api', httpMethod: 'GET', name: 'call api in js server', description: 'js作为服务站点',
-    onInvoke: function (requestData_bytes, rpcData, reply_rpcData) {
-        var request_string = vit.bytesToString(requestData_bytes);
-        vit.logger.info('[api调用] request:' + request_string);
-
-        var replyData = {
-            success: true,
-            data:
-            {
-                request_string: request_string,
-                _: Math.random()
-            }
-        };
-        return vit.objectSerializeToBytes(replyData);
+    {
+        route: '/JsStation/api', httpMethod: 'GET', name: 'call api in js server', description: 'js作为服务站点',
+        onInvoke: function (requestData_bytes, rpcData_object, replyRpcData_object) {
+            var request_string = vit.bytesToString(requestData_bytes);
+            vit.logger.info('[api调用] request:' + request_string);
+
+            var replyData = {
+                success: true,
+                data:
+                {
+                    request_string: request_string,
+                    _: Math.random()
+                }
+            };
+            return vit.objectSerializeToBytes(replyData);
+        }
     }
-}
-
-
-
-
 ]
 </textarea>
                 </td>
                 <td>
-<textarea type="text" id="txt_callApi" rows="30" cols="80">
-serviceStation.apiClient.callApi("/JsStation/api1", {name:'sers'}, 'GET',
-function (isSuccess, replyData_bytes, replyRpcData_object) {
-    if (!isSuccess) {
-        vit.logger.info("接口调用失败!");
-        return;
-    }
-    //var apiRet = vit.bytesToObject(replyData_bytes); 
-    var str = vit.bytesToString(replyData_bytes);
-    vit.logger.info("接口调用成功。 reply:" + vit.bytesToString(replyData_bytes));
-});
+                    <textarea type="text" id="txt_callApi" rows="30" cols="80">
+serviceStation.apiClient.callApiAsync("/JsStation/api1", { name: 'sers' }, 'GET',
+    function (isSuccess, replyData_bytes, replyRpcData_object) {
+        if (!isSuccess) {
+            vit.logger.info("接口调用失败!");
+            return;
+        }
+        //var apiRet = vit.bytesToObject(replyData_bytes); 
+        var str = vit.bytesToString(replyData_bytes);
+        vit.logger.info("接口调用成功。 reply:" + vit.bytesToString(replyData_bytes));
+    });
 
 
 </textarea>
@@ -78,7 +73,10 @@ function (isSuccess, replyData_bytes, replyRpcData_object) {
 
     <script src="sers.ServiceStation.min.js"></script>
     <script>
+        var serviceStation = new sers.ServiceStation();
 
+        //------------------------------------------------------------------------
+        //(x.1)appsettings.json
         var appsettings =
         {
             CL: {
@@ -94,10 +92,13 @@ function (isSuccess, replyData_bytes, replyRpcData_object) {
         };
 
 
+        //------------------------------------------------------------------------
+        //(x.2)event
 
+        //(x.x.1)register logger.onmessage
         //type: info/error
-		//e: pass error when type is error
-		//function(message,type,e){ }
+        //e: pass error when type is error
+        //function(message,type,e){ }
         vit.logger.onmessage = function (message, type, e) {
             if (e) message = message + '\n' + e.stack;
 
@@ -106,12 +107,10 @@ function (isSuccess, replyData_bytes, replyRpcData_object) {
             txt_log.scrollTop = txt_log.scrollHeight;
         };
 
-
-        var serviceStation = new sers.ServiceStation();
-
-        //(Error e,requestData_bytes,rpcData,replyRpcDta)
-        //localApiService.onError = function(e,requestData_bytes,rpcData,replyRpcDta){ return {success:false}; }
-        serviceStation.localApiService.onError = function (e, requestData_bytes, rpcData, replyRpcDta) {
+        //(x.x.2)register localApiService.onError
+        //(Error e,requestData_bytes,rpcData_object,replyRpcData_object)
+        //localApiService.onError = (e,requestData_bytes,rpcData_object,replyRpcData_object)=>{ return {success:false}; }
+        serviceStation.localApiService.onError = function (e, requestData_bytes, rpcData_object, replyRpcData_object) {
             vit.logger.error(e);
             var reply = {
                 success: false,
@@ -123,51 +122,60 @@ function (isSuccess, replyData_bytes, replyRpcData_object) {
             return reply;
         };
 
+        //(x.x.3)register onDisconnected from serviceCenter
+        serviceStation.org.event_onDisconnected = function () {
+            vit.logger.info('[sers.CL]org.event_onDisconnected');
+        };
 
+        //------------------------------------------------------------------------
+        //(x.3)api controller
 
         /*
-           apiNodes demo:
-           //onInvoke:   function(requestData_bytes,rpcData_object,reply_rpcData_object){}
+            // apiInvoke  {route: '/JsStation/api', httpMethod: 'GET', name: 'call api in js server', description: 'js作为服务站点', onInvoke,onInvokeAsync}
+            // onInvoke:   (requestData_bytes,rpcData_object,replyRpcData_object)=>{ return replyData_bytes; }	 //onInvoke 和 onInvokeAsync 指定其一即可
+            // onInvokeAsync:   (requestData_bytes,rpcData_object,replyRpcData_object,onInvokeFinish)=>{ }
+            //					onInvokeFinish :(replyData_bytes)=>{ }
+
+            //demo:
             {
                 route: '/JsStation/api', httpMethod: 'GET', name: 'call api in js server', description: 'js作为服务站点',
-                onInvoke: function (requestData_bytes, rpcData, reply_rpcData) {
-                    var request_string = vit.bytesToString(requestData_bytes);
-                    vit.logger.info('[api调用] request:' + request_string);
-
-                    var replyData = {
-                        success: true,
-                        data:{
-                            request_string: request_string,
-                            _: Math.random()
-                        }
-                    };
-                    return vit.objectSerializeToBytes(replyData);
-                }
+                    onInvoke: function (requestData_bytes, rpcData_object, replyRpcData_object) {
+                        var request_string = vit.bytesToString(requestData_bytes);
+                        vit.logger.info('[api调用] request:' + request_string);
+
+                        var replyData = {
+                            success: true,
+                            data: {
+                                request_string: request_string,
+                                _: Math.random()
+                            }
+                        };
+                        return vit.objectSerializeToBytes(replyData);
+                    }
             }
-        */
-
-
+        //*/
 
+        //------------------------------------------------------------------------
+        //(x.4)startService
         function startService() {
             try {
+                appsettings = eval('(' + txt_appsettings.value + ')');
+                var apiInvokeArray = eval('(' + txt_apiNodes.value + ')');
+
+
+
                 vit.logger.info('');
                 vit.logger.info('--------------------------------------------');
 
                 //(x.1)load localApi
                 vit.logger.info('[ApiLoader] load localApi...');
-                var str_apiNodes = txt_apiNodes.value;
-                var apiNodes = eval('(' + str_apiNodes + ')');
-
                 serviceStation.localApiService.clearApiNodes();
-                for (var item of apiNodes) {
-                    serviceStation.localApiService.addSimpleApiNode(item.route, item.httpMethod.toUpperCase(), item.name, item.description, item.onInvoke);
-                }
-                vit.logger.info('loaded localApi,count:' + apiNodes.length);
+                serviceStation.localApiService.addApiInvokeArray(apiInvokeArray);
+                vit.logger.info('loaded localApi,count:' + apiInvokeArray.length);
 
 
                 //(x.2)load configuration
                 vit.logger.info('load configuration...');
-                appsettings = eval('(' + txt_appsettings.value + ')');
 
                 //设置websocket host 地址
                 serviceStation.org.setHost(appsettings.CL.host);
@@ -178,12 +186,7 @@ function (isSuccess, replyData_bytes, replyRpcData_object) {
                 serviceStation.serviceStationInfo = appsettings.serviceStationInfo;
 
 
-                //(x.3)event
-                serviceStation.org.event_onDisconnected = function () {
-                    vit.logger.info('[sers.CL]org.event_onDisconnected');
-			    };
-
-                //(x.4)connect
+                //(x.3)connect
                 serviceStation.start();
             } catch (e) {
                 vit.logger.error(e);

+ 174 - 0
dotnet/ServiceCenter/App.Gover.Gateway/wwwroot/JsStation/sers.ServiceStation.demo.js

@@ -0,0 +1,174 @@
+
+//------------------------------------------------------------------------
+var serviceStation = new sers.ServiceStation();
+
+//apiInvokeArray
+/* 
+    // apiInvoke  {route: '/JsStation/api', httpMethod: 'GET', name: 'call api in js server', description: 'js作为服务站点', onInvoke,onInvokeAsync}
+    //      onInvoke:   (requestData_bytes,rpcData_object,replyRpcData_object)=>{ return replyData_bytes; }	 //onInvoke 和 onInvokeAsync 指定其一即可
+    //      onInvokeAsync:   (requestData_bytes,rpcData_object,replyRpcData_object,onInvokeFinish)=>{ }
+    //					    onInvokeFinish :(replyData_bytes)=>{ }
+
+    //demo:
+    {
+        route: '/JsStation/api', httpMethod: 'GET', name: 'call api in js server', description: 'js作为服务站点',
+            onInvoke: function (requestData_bytes, rpcData_object, replyRpcData_object) {
+                var request_string = vit.bytesToString(requestData_bytes);
+                vit.logger.info('[api调用] request:' + request_string);
+
+                var replyData = {
+                    success: true,
+                    data: {
+                        request_string: request_string,
+                        _: Math.random()
+                    }
+                };
+                return vit.objectSerializeToBytes(replyData);
+            }
+    }
+//*/
+var apiInvokeArray =
+    [
+        {
+            route: '/JsStation/api', httpMethod: 'GET', name: 'call api in js server', description: 'js作为服务站点',
+            onInvoke: function (requestData_bytes, rpcData_object, replyRpcData_object) {
+                var request_string = vit.bytesToString(requestData_bytes);
+                vit.logger.info('[api调用] request:' + request_string);
+
+                var replyData = {
+                    success: true,
+                    data:
+                    {
+                        request_string: request_string,
+                        _: Math.random()
+                    }
+                };
+                return vit.objectSerializeToBytes(replyData);
+            }
+        }
+    ];
+
+
+
+
+
+//------------------------------------------------------------------------
+//(x.1)appsettings.json
+var appsettings =
+{
+    CL: {
+        host: 'ws://127.0.0.1:4503',
+        secretKey: 'SersCL'
+    },
+    serviceStationInfo: {
+        serviceStationName: 'JsStation',
+        serviceStationKey: '',
+        stationVersion: '',
+        info: {}
+    }
+};
+
+//------------------------------------------------------------------------
+//(x.2)event
+
+//(x.x.1)register logger.onmessage
+//type: info/error
+//e: pass error when type is error
+//function(message,type,e){ }
+vit.logger.onmessage = function (message, type, e) {
+    if (e) message = message + '\n' + e.stack;
+
+    console.log(message);
+    txt_log.value = txt_log.value + '\n' + message;
+    txt_log.scrollTop = txt_log.scrollHeight;
+};
+
+//(x.x.2)register localApiService.onError
+//(Error e,requestData_bytes,rpcData_object,replyRpcData_object)
+//localApiService.onError = (e,requestData_bytes,rpcData_object,replyRpcData_object)=>{ return {success:false}; }
+serviceStation.localApiService.onError = function (e, requestData_bytes, rpcData_object, replyRpcData_object) {
+    vit.logger.error(e);
+    var reply = {
+        success: false,
+        error: {
+            errorMessage: e.message,
+            errorDetail: { name: e.name, stack: e.stack }
+        }
+    };
+    return reply;
+};
+
+//(x.x.3)register onDisconnected from serviceCenter
+serviceStation.org.event_onDisconnected = function () {
+    vit.logger.info('[sers.CL]org.event_onDisconnected');
+};
+
+
+//------------------------------------------------------------------------
+//(x.4)startService
+
+function startService() {
+    try {
+        vit.logger.info('');
+        vit.logger.info('--------------------------------------------');
+
+        //(x.1)load localApi
+        vit.logger.info('[ApiLoader] load localApi...');
+        serviceStation.localApiService.clearApiNodes();
+        serviceStation.localApiService.addApiInvokeArray(apiInvokeArray);
+        vit.logger.info('loaded localApi,count:' + apiInvokeArray.length);
+
+
+        //(x.2)load configuration
+        vit.logger.info('load configuration...');
+
+        //设置websocket host 地址
+        serviceStation.org.setHost(appsettings.CL.host);
+
+        //连接秘钥,用以验证连接安全性。服务端和客户端必须一致
+        serviceStation.org.secretKey = appsettings.CL.secretKey;
+
+        serviceStation.serviceStationInfo = appsettings.serviceStationInfo;
+
+        //(x.3)connect
+        serviceStation.start();
+    } catch (e) {
+        vit.logger.error(e);
+    }
+}
+
+
+
+
+
+//------------------------------------------------------------------------
+//(x.5) call api
+serviceStation.apiClient.callApiAsync("/JsStation/api1", { name: 'sers' }, 'GET',
+    function (isSuccess, replyData_bytes, replyRpcData_object) {
+        if (!isSuccess) {
+            vit.logger.info("接口调用失败!");
+            return;
+        }
+        //var apiRet = vit.bytesToObject(replyData_bytes); 
+        var str = vit.bytesToString(replyData_bytes);
+        vit.logger.info("接口调用成功。 reply:" + vit.bytesToString(replyData_bytes));
+    });
+
+
+
+
+
+
+//------------------------------------------------------------------------
+//(x.9)stopService
+function stopService() {
+    try {
+        vit.logger.info('');
+        vit.logger.info('--------------------------------------------');
+        vit.logger.info('断开连接...');
+        serviceStation.stop();
+        vit.logger.info('连接已断开');
+    } catch (e) {
+        vit.logger.error(e);
+    }
+}

+ 91 - 58
dotnet/ServiceCenter/App.Gover.Gateway/wwwroot/JsStation/sers.ServiceStation.js

@@ -1,12 +1,12 @@
 /*
  * sers.ServiceStation.js
- * Date   : 2022-01-15
- * Version: 2.1.16
+ * Date   : 2022-01-23
+ * Version: 2.1.17-temp
  * author : Lith
  * email  : serset@yeah.net
  */
 
-; sers = { version: '2.1.16' };
+; sers = { version: '2.1.17-temp' };
 
 /*
  * vit.js 扩展
@@ -428,6 +428,9 @@
 		//callback: function(replyData){ }
 		self.event_onGetRequest;
 
+		//请求超时时间(单位ms,默认300000)
+		self.requestTimeoutMs = 300000;
+
 		//外部调用,当外部从delivery读取到数据时调用
 		self.deliveryToOrganize_onGetMessageFrame = function (bytes) {
 			//deliveryToOrganize_ProcessFrame
@@ -513,7 +516,7 @@
 				if (callback)
 					callback(replyData, isSuccess);
 			};
-			setTimeout(onCall, 60000);
+			setTimeout(onCall, self.requestTimeoutMs);
 
 			organizeToDelivery_RequestMap[reqKey] = function (replyData) { onCall(replyData, true); };
 
@@ -568,7 +571,7 @@
 		var requestAdaptor = new RequestAdaptor();
 
 
-		//<<<<<<<<<<<<<<<< 初始化requestAdaptor 和 delivery
+		//初始化requestAdaptor 和 delivery
 		(function () {
 
 			delivery.event_onGetFrame = function (bytes) {
@@ -589,7 +592,7 @@
 			};
 
 		})();
-		//>>>>>>>>>>>>>>>>>
+	 
 
 		//function (event) { }
 		self.event_onDisconnected = null;
@@ -757,7 +760,7 @@
 
 		//(string route, object arg, string httpMethod, function callback)
 		//callback: function(isSuccess,replyData_bytes,replyRpcData_object)
-		this.callApi = function (route, arg, httpMethod, callback) {
+		this.callApiAsync = function (route, arg, httpMethod, callback) {
 			var apiRequestMessage = new ApiMessage();
 			apiRequestMessage.initAsApiRequestMessage(route, arg, httpMethod);
 
@@ -776,19 +779,22 @@
 				}
 			});
 		};
+
 	};
 
 	//LocalApiService
 	sers.LocalApiService = function () {
 		var self = this;
 
-		// key   route_httpMehtod
-		// value   {  apiDesc:apiDesc,Invoke:onInvoke  }
-		// onInvoke:   function(requestData_bytes,rpcData,reply_rpcData){}
+		// route_httpMethod -> ApiNode
+		// ApiNode:   {  apiDesc,onInvoke,onInvokeAsync  }  //onInvoke 和 onInvokeAsync 指定其一即可
+        //      onInvoke:   (requestData_bytes,rpcData_object,replyRpcData_object)=>{ return replyData_bytes; }	 //onInvoke 和 onInvokeAsync 指定其一即可
+        //      onInvokeAsync:   (requestData_bytes,rpcData_object,replyRpcData_object,onInvokeFinish)=>{ }
+        //					    onInvokeFinish :(replyData_bytes)=>{ }
 		var apiNodeMap = {};
 
-		//return [  apiNode,  ];
-		//apiNode  {apiDesc:apiDesc }
+		//return [  ApiNode ];
+		//ApiNode  {apiDesc:apiDesc }
 		self.getApiNodes = function () {
 			var apiNodes = [];
 			for (var key in apiNodeMap) {
@@ -802,29 +808,46 @@
 			apiNodeMap = {};
 		};
 
-		//Invoke:   function(requestData_bytes,rpcData_object,reply_rpcData_object){}
-		self.addApiNode = function (apiDesc, Invoke) {
-			var apiKey = apiDesc.route + '_' + apiDesc.extendConfig.httpMethod;
-			apiNodeMap[apiKey] = { apiDesc: apiDesc, Invoke: Invoke };
-		};
 
-		//(string route, string httpMethod, string name, string description, Invoke Invoke)
-		//Invoke:   function(requestData_bytes,rpcData_object,reply_rpcData_object){}
-		self.addSimpleApiNode = function (route, httpMethod, name, description, Invoke) {
-			var apiDesc = {
-				route: route,
-				name: name,
-				description: description,
-				extendConfig: {
-					httpMethod: httpMethod
+		// ApiNode:   {  apiDesc,onInvoke,onInvokeAsync  }  //onInvoke 和 onInvokeAsync 指定其一即可
+        //      onInvoke:   (requestData_bytes,rpcData_object,replyRpcData_object)=>{ return replyData_bytes; }	 //onInvoke 和 onInvokeAsync 指定其一即可
+        //      onInvokeAsync:   (requestData_bytes,rpcData_object,replyRpcData_object,onInvokeFinish)=>{ }
+        //					    onInvokeFinish :(replyData_bytes)=>{ }
+		self.addApiNode = function (apiNode) {		 
+			var apiKey = apiNode.apiDesc.route + '_' + apiNode.apiDesc.extendConfig.httpMethod;
+            apiNodeMap[apiKey] = apiNode;
+        };
+
+
+        // apiInvoke  {route: '/JsStation/api', httpMethod: 'GET', name: 'call api in js server', description: 'js作为服务站点', onInvoke,onInvokeAsync}
+        //      onInvoke:   (requestData_bytes,rpcData_object,replyRpcData_object)=>{ return replyData_bytes; }	 //onInvoke 和 onInvokeAsync 指定其一即可
+        //      onInvokeAsync:   (requestData_bytes,rpcData_object,replyRpcData_object,onInvokeFinish)=>{ }
+        //					    onInvokeFinish :(replyData_bytes)=>{ }
+        self.addApiInvoke = function (apiInvoke) {
+            var apiDesc = {
+                route: apiInvoke.route,
+                name: apiInvoke.name,
+                description: apiInvoke.description,
+                extendConfig: {
+					httpMethod: apiInvoke.httpMethod
 				}
 			};
-			self.addApiNode(apiDesc, Invoke);
+			self.addApiNode({ apiDesc, onInvoke: apiInvoke.onInvoke, onInvokeAsync: apiInvoke.onInvokeAsync });
+		};
+
+        // apiInvoke  {route: '/JsStation/api', httpMethod: 'GET', name: 'call api in js server', description: 'js作为服务站点', onInvoke,onInvokeAsync}
+        //      onInvoke:   (requestData_bytes,rpcData_object,replyRpcData_object)=>{ return replyData_bytes; }	 //onInvoke 和 onInvokeAsync 指定其一即可
+        //      onInvokeAsync:   (requestData_bytes,rpcData_object,replyRpcData_object,onInvokeFinish)=>{ }
+        //					    onInvokeFinish :(replyData_bytes)=>{ }
+		self.addApiInvokeArray = function (apiInvokeArray) {
+			for (var apiInvoke of apiInvokeArray) {
+				self.addApiInvoke(apiInvoke);
+			}
 		};
 
-		//(Error e,requestData_bytes,rpcData,replyRpcDta)
-	    //localApiService.onError = function(e,requestData_bytes,rpcData,replyRpcDta){ return {success:false}; }
-		self.onError = function (e, requestData_bytes, rpcData, replyRpcDta) {
+		//(Error e,requestData_bytes,rpcData_object,replyRpcData_object)
+	    //localApiService.onError = (e,requestData_bytes,rpcData_object,replyRpcData_object)=>{ return {success:false}; }
+		self.onError = function (e, requestData_bytes, rpcData_object, replyRpcData_object) {
 			logger.error(e);
 			var reply = {
 				success: false,
@@ -836,31 +859,50 @@
 			return reply;
 		};
 
-		//apiRequestMessage bytes
-		//return apiReplyMessage bytes
-		self.callApi = function (apiRequestMessage) {
+		//invoke local api
+		//apiRequestMessage:bytes
+		//callback: (reply_bytes)=>{ }
+		self.invokeApiAsync = (apiRequestMessage, callback)=>{
 
 			//(x.1) 解析请求数据
 			var apiMessage = new ApiMessage();
 			apiMessage.unpackage(apiRequestMessage);
 
-			var rpcData = apiMessage.getRpcData();
+			var rpcData_object = apiMessage.getRpcData();
 			var requestData_bytes = apiMessage.getValueBytes();
 
 			//(x.2)解析路由获得 处理函数
-			var route = rpcData.route;
-			var httpMethod = rpcData.http.method;
+			var route = rpcData_object.route;
+			var httpMethod = rpcData_object.http.method;
 			var apiKey = route + '_' + httpMethod;
 			var apiNode = apiNodeMap[apiKey];
 
+	
+
 			//(x.3)进行处理获得结果数据
-			var replyRpcDta = {}, replyData;
-			if (apiNode && apiNode.Invoke) {
+			var replyRpcData_object = {}, replyData_bytes;
+			var onInvokeFinish = (replyData_bytes) => {
+				//返回结果数据
+				var apiReplyMessage_bytes = ApiMessage.package(
+					vit.objectSerializeToBytes(replyRpcData_object),
+					replyData_bytes
+				);
+				callback(apiReplyMessage_bytes);
+			};
+
+			if (apiNode) {
+				
 				try {
-					replyData = apiNode.Invoke(requestData_bytes, rpcData, replyRpcDta);
+                    if (apiNode.onInvoke) {
+                        replyData_bytes = apiNode.onInvoke(requestData_bytes, rpcData_object, replyRpcData_object);
+                    } else if (apiNode.onInvokeAsync) {
+                        apiNode.onInvokeAsync(requestData_bytes, rpcData_object, replyRpcData_object, onInvokeFinish);
+                        return;
+                    }
+					
 				} catch (e) {					
-					var reply = self.onError(e, requestData_bytes, rpcData, replyRpcDta);
-					replyData = vit.objectSerializeToBytes(reply);
+					var reply = self.onError(e, requestData_bytes, rpcData_object, replyRpcData_object);
+					replyData_bytes = vit.objectSerializeToBytes(reply);
 				}
 
 			} else {
@@ -873,15 +915,9 @@
 					}
 				};
 
-				replyData = vit.objectSerializeToBytes(reply);
-			}
-
-			//(x.4)返回结果数据
-			var apiReplyMessage_bytes = ApiMessage.package(
-				vit.objectSerializeToBytes(replyRpcDta),
-				replyData
-			);
-			return apiReplyMessage_bytes;
+				replyData_bytes = vit.objectSerializeToBytes(reply);
+			} 
+			onInvokeFinish(replyData_bytes);
 		};
 	};
 
@@ -903,10 +939,7 @@
 			//    logger.info('[sers.CL]org.event_onDisconnected');
 			//};
 
-			self.org.event_onGetRequest = function (requestData, callback) {
-				var reply_bytes = self.localApiService.callApi(requestData);
-				callback(reply_bytes);
-			};
+			self.org.event_onGetRequest = self.localApiService.invokeApiAsync;
 		})();
 
 
@@ -917,7 +950,7 @@
 
 		//(x.4)
 		self.stop = function () {
-			logger.info('[sers.ServiceStation]try stop...');
+			logger.info('[sers.ServiceStation] try stop...');
 			self.org.stop();
 			logger.info('[sers.ServiceStation] stoped.');
 		};
@@ -934,11 +967,11 @@
 		//callback: function(isSuccess){}
 		self.start = function (callback) {
 
-			logger.info('[sers.CL]try connect...');
+			logger.info('[sers.CL] try connect...');
 			self.org.connect(function (isSuccess) {
 
 				if (!isSuccess) {
-					logger.info('[sers.CL]org cannot connect to server!');
+					logger.info('[sers.CL] org cannot connect to server!');
 					if (callback) callback(false);
 					return;
 				}
@@ -957,7 +990,7 @@
 
 				//(string route, object arg, string httpMethod, function callback)
 				//callback: function(isSuccess,replyData_bytes,replyRpcData_object)
-				self.apiClient.callApi("/_sys_/serviceStation/regist", serviceStationData, 'POST', function (isSuccess, replyData_bytes, replyRpcData_object) {
+				self.apiClient.callApiAsync("/_sys_/serviceStation/regist", serviceStationData, 'POST', function (isSuccess, replyData_bytes, replyRpcData_object) {
 
 					if (!isSuccess) {
 						logger.info("[ServiceStation] regist - failed");