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()); } }
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_); } }
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()); } } }