internal DextopRemoteMethodCallResult ExecuteMethodCall(DextopRemoteMethodCall call) { try { if (call.RemoteId == null) { throw new InvalidDextopRemoteMethodCallException(); } RemotableContext context; if (!remotables.TryGetValue(call.RemoteId, out context)) { throw new InvalidDextopRemoteMethodCallException(); } DextopRemoteMethodInvokeResult result; result = DextopApplication.RemoteMethodInvoker.Invoke(context.Remotable, call.MethodName, call.Arguments, call.FormSubmit); if (result.Success) { return new DextopRemoteMethodCallResult { success = true, result = result.Result } } ; var map = context.Remotable.Remote.OnMapRemotingException ?? MapRemotingException; return(new DextopRemoteMethodCallResult { success = false, result = map(result.Exception) }); } catch (Exception ex) { object res; try { res = MapRemotingException(ex); } catch (Exception mex) { res = new DextopRemoteMethodCallException { exception = mex.Message, stackTrace = mex.StackTrace }; } return(new DextopRemoteMethodCallResult { success = false, result = res }); } }
internal IList <Response> HandleRemotingRequest(HttpContext context, Request[] requests) { if (Culture != null) { Thread.CurrentThread.CurrentCulture = Culture; } HttpContext = context; var responses = new List <Response>(); foreach (var request in requests) { /* This part blocks out of order processing of direct transactions for 2 seconds. * This is important as two sequential http request can come in different order than sent. * Luckily Ext.direct has tid field. */ int waitCounter = 20; while (request.tid > lastTid + 1 && --waitCounter > 0) { Thread.Sleep(100); } if (request.tid > lastTid) { lastTid = request.tid; } var call = new DextopRemoteMethodCall { FormSubmit = request.FormSubmit, RemoteId = request.data[0], Arguments = DextopUtil.Decode <String[]>(request.data[2]), MethodName = request.data[1] }; var response = new Response { type = "rpc", method = request.method, tid = request.tid, action = request.action }; responses.Add(response); try { response.result = ExecuteMethodCall(call); } catch (Exception ex) { response.result = new DextopRemoteMethodCallResult { success = false, result = new DextopRemoteMethodCallException { type = "rpc", exception = ex.Message, stackTrace = ex.StackTrace } }; } } HttpContext = null; return(responses); }