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
                });
            }
        }
Example #2
0
        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);
        }