private CommandResult Process(Command command) { var serviceDescriptor= ServiceRegistry.ResolveServiceDescriptor(command.CallContract); var methodDescriptor = ServiceRegistry.ResolveMethodDescriptor(command.CallContract, command.Method2Invoke); List<object> parameters = new List<object>(); foreach (var pd in methodDescriptor.ParameterDescriptors) parameters.Add(ParameterParser.GetValue(command, pd)); object serviceInstance = Activator.CreateInstance(serviceDescriptor.ServiceType); bool successful = false; Exception exc=null; bool noReturnValue = false; object resultValue = null; if (methodDescriptor.MethodInfo.ReturnType.Equals(typeof(void))) noReturnValue = true; try { if (noReturnValue) methodDescriptor.MethodInfo.Invoke(serviceInstance, parameters.ToArray()); else resultValue = methodDescriptor.MethodInfo.Invoke(serviceInstance, parameters.ToArray()); successful = true; } catch(Exception ex) { exc = ex.InnerException; successful = false; } CommandResult result = new CommandResult(); result.Sucessful = successful; result.ConnectionWorker = command.ConnectionWorker; if (successful) { if (!noReturnValue) result.Result = SerializerUtility.Instance().BinSerialize(resultValue); } else { result.Exception = SerializerUtility.Instance().BinSerialize(exc); } result.ConnectionWorker.LastActiveTime = DateTime.Now; //reset timeout return result; }
public void Enqueue(CommandResult cmd) { innerQueue.Add(cmd); }
internal void SendResponse(CommandResult result) { MemoryStream ms = new MemoryStream(); BufferedStream bs = new BufferedStream(ms); BinaryWriter bw = new BinaryWriter(bs, UnicodeEncoding.UTF8); var cmdBytes = SerializerUtility.Instance().BinSerialize(result); bw.Write(cmdBytes.Length); bw.Write(cmdBytes); bw.Flush(); if (!this.IsTagged) { try { this.Socket.Send(ms.ToArray()); } catch (Exception ex) { Console.WriteLine("Socket.Send失败"); } } }
internal static void AddCommandResultToOutgoingQueueRepository(CommandResult cmdResult) { outgoingQueueRepository.Enqueue(cmdResult); }