public ProxyFactory(ClientConfig config) { this.Config = config; rpcContainer = new RpcContainer <IClentController>(); rpcContainer.Load(config.BinPath); sessionId = new SessionId(1); }
public RpcServer(RpcServerConfig config, ILoger loger) : base(config, loger) { rpcConfig = config; rpcContainer = new RpcContainer<IServerController>(); RpcFactory = new ProxyFactory(config); }
public override void OnDisConnect(ITcpClientSession session) { RpcContainer.DestroyScope(session.SessionId); foreach (var taskSource in taskDict.Values) { taskSource.SetException(new Exception("Disconnected with the server")); } }
protected void CallProcess(RpcCallData data) { try { IClentController controller = RpcContainer.GetController(SessionId, data.Controller.ToLower()); string key = (data.Controller + ":" + data.Action).ToLower(); var method = RpcContainer.GetMethod(key); object[] args = null; if (data.Arguments != null && data.Arguments.Count > 0) { args = new object[data.Arguments.Count]; var types = GetParaTypeList(key); for (int i = 0; i < data.Arguments.Count; i++) { var arg = data.Arguments[i]; MemoryStream stream = new MemoryStream(arg, 0, arg.Length); var obj = Serializer.NonGeneric.Deserialize(types[i], stream); args[i] = obj; stream.Dispose(); } } RpcReturnData result = new RpcReturnData() { Id = data.Id }; object value = method.Invoke(controller, args); var ms = new MemoryStream(); Serializer.Serialize(ms, value); byte[] bytes = new byte[ms.Position]; Buffer.BlockCopy(ms.GetBuffer(), 0, bytes, 0, bytes.Length); result.Value = bytes; ms.Position = 0; ms.WriteByte(2); Serializer.Serialize(ms, result); byte[] rBytes = new byte[ms.Position]; Buffer.BlockCopy(ms.GetBuffer(), 0, rBytes, 0, rBytes.Length); SendAsync(rBytes); ms.Dispose(); } catch (Exception e) { RpcErrorInfo error = new RpcErrorInfo() { Id = data.Id, Message = e.Message }; var ms = new MemoryStream(); ms.WriteByte(0); Serializer.Serialize(ms, error); byte[] rBytes = new byte[ms.Position]; Buffer.BlockCopy(ms.GetBuffer(), 0, rBytes, 0, rBytes.Length); SendAsync(rBytes); ms.Dispose(); } }
public List <Type> GetParaTypeList(string key) { List <Type> result; if (!methodParasDict.TryGetValue(key, out result)) { result = RpcContainer.GetMethod(key).GetParameters().Select(p => p.ParameterType).ToList(); methodParasDict.TryAdd(key, result); } return(result); }
public RpcTask Send(uint packetId, RpcTask task) { if (task.ExpireDate < DateTime.Now) { ProcessCompleteTask(task); return(task); } var container = new RpcContainer(task.Rpc.Argument); container.Id = (uint)task.Id; lock (lck) { RpcIds.Add(packetId); } RegisterTask(task); Session.Send(packetId, container); return(task); }
public RpcServer(RpcServerConfig config, ILoger loger) : base(config, loger) { rpcConfig = config; rpcContainer = new RpcContainer <IServerController>(); RpcFactory = new ProxyFactory(config); }
public override void OnConnected(ITcpClientSession session) { RpcContainer.CreateScope(session.SessionId); }