Beispiel #1
0
        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;
        }
Beispiel #2
0
 public void Enqueue(CommandResult cmd)
 {
     innerQueue.Add(cmd);
 }
Beispiel #3
0
        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失败");
                }
            }
        }
Beispiel #4
0
 internal static void AddCommandResultToOutgoingQueueRepository(CommandResult cmdResult)
 {
     outgoingQueueRepository.Enqueue(cmdResult);
 }