예제 #1
0
        protected override object Invoke(MethodInfo targetMethod, object[] args)
        {
            if (!Handlers.TryGetValue(targetMethod.Name, out ClientActionHandler handler))
            {
                var error = new XRPCException($"{targetMethod.Name} action not found!");
                error.ErrorCode = (short)StatusCode.ACTION_NOT_FOUND;
                throw error;
            }
            else
            {
                if (!handler.IsTaskResult)
                {
                    var error = new XRPCException("Definition is not supported, please define task with return value!");
                    error.ErrorCode = (short)StatusCode.NOT_SUPPORT;
                    throw error;
                }

                var request = new RPCPacket();
                request.Url  = handler.Url;
                request.Data = args;
                var task = Server.SendWait(request, Session, handler.ResponseType);
                IAnyCompletionSource source = handler.GetCompletionSource();
                source.WaitResponse(task);
                return(source.GetTask());
            }
        }
예제 #2
0
 public async void WaitResponse(Task <RPCPacket> task)
 {
     try
     {
         var response = await task;
         if (response.Status != (short)StatusCode.SUCCESS)
         {
             XRPCException error = new XRPCException((string)response.Data[0]);
             Error(error);
         }
         else
         {
             if (response.Paramters > 0)
             {
                 object result = response.Data[0];
                 Success(result);
             }
             else
             {
                 Success(new object());
             }
         }
     }catch (Exception e_)
     {
         Error(e_);
     }
 }
예제 #3
0
        protected override object Invoke(MethodInfo targetMethod, object[] args)
        {
            if (!mHandlers.TryGetValue(targetMethod.Name, out ClientActionHandler handler))
            {
                var error = new XRPCException($"{targetMethod.Name} action not found!");
                error.ErrorCode = (short)StatusCode.ACTION_NOT_FOUND;
                throw error;
            }
            else
            {
                if (!handler.IsTaskResult)
                {
                    var error = new XRPCException("Definition is not supported, please define task with return value!");
                    error.ErrorCode = (short)StatusCode.NOT_SUPPORT;
                    throw error;
                }

                var request = new RPCPacket();
                request.Url  = handler.Url;
                request.Data = args;
                if (!string.IsNullOrEmpty(Actor))
                {
                    request.Header = new Dictionary <string, string>();
                    request.Header[EventCenter.ACTOR_TAG] = this.Actor;
                }
                if (mHeader.Count > 0)
                {
                    if (request.Header == null)
                    {
                        request.Header = new Dictionary <string, string>();
                    }
                    foreach (var item in mHeader)
                    {
                        request.Header.Add(item.Key, item.Value);
                    }
                }
                var task = Client.SendWait(request, TcpClient, handler.ResponseType);
                if (!handler.IsTaskResult)
                {
                    if (task.Wait(Client.TimeOut))
                    {
                        var response = task.Result;
                        if (response.Status == (short)StatusCode.SUCCESS)
                        {
                            if (response.Paramters > 0)
                            {
                                return(response.Data[0]);
                            }
                            return(null);
                        }
                        else
                        {
                            Client.AwaiterFactory.GetItem(request.ID);
                            var error = new XRPCException((string)response.Data[0]);
                            error.ErrorCode = response.Status;
                            throw error;
                        }
                    }
                    else
                    {
                        var error = new XRPCException($"{targetMethod.Name} action time out!");
                        error.ErrorCode = (short)StatusCode.REQUEST_TIMEOUT;
                        throw error;
                    }
                }
                else
                {
                    IAnyCompletionSource source = handler.GetCompletionSource();
                    source.WaitResponse(task);
                    return(source.GetTask());
                }
            }
        }