Exemple #1
0
        public void CallVoidMethod(RemoteProcedureDescriptor descriptor, params object[] parameters)
        {
            if (_remoteProcedureCaller == null)
            {
                throw new InvalidOperationException();
            }

            var remoteCommand = new RemoteCommand
            {
                RemoteSessionInformation = new RemoteSessionInformation
                {
                    InstanceId = _remoteSessionInformation.InstanceId,
                    ScopeId    = _remoteSessionInformation.ScopeId,
                    ActionId   = Guid.NewGuid()
                },
                RemoteProcedureDescriptor = descriptor,
                Parameters = parameters
            };

            var result = _remoteProcedureCaller.CallMethod(remoteCommand);

            if (result.Exception != null)
            {
                throw new RemoteException("Remote Service threw an exception", ConvertResult <Exception>(result.Exception));
            }
        }
        public RemoteProcedureDescriptor FindDescriptor(MethodInfo methodInfo)
        {
            var descriptor = new RemoteProcedureDescriptor(
                _methods.FirstOrDefault(o => o.Value.Item2 == methodInfo).Key
                );

            return(descriptor);
        }
        public InterfaceHash AddInterface(ServiceHash serviceHash, Type iface)
        {
            // Hash all methods
            var methodHashes = iface.GetMethods()
                               .Select(m => new { Method = m, Hash = HashMethod(m) })
                               .ToList();

            // Hash all inherited interfaces
            var interfaceHashes = iface.GetInterfaces()
                                  .Select(i => new { Interface = i, Hash = AddInterface(serviceHash, i) });

            // Hash this interface, based on our methods and interfaces
            var interfaceHash = HashInterface(iface,
                                              methodHashes.Select(m => m.Hash),
                                              interfaceHashes.Select(i => i.Hash)
                                              );

            var descriptor = new RemoteProcedureDescriptor
            {
                ServiceHash   = serviceHash,
                InterfaceHash = interfaceHash
            };

            foreach (var method in methodHashes)
            {
                descriptor.MethodName      = method.Hash.Name;
                descriptor.MethodSignature = method.Hash.Signature;

                // We only need to add it once
                if (!_methods.ContainsKey(descriptor.ToGuid()))
                {
                    _methods.Add(descriptor.ToGuid(), Tuple.Create(iface, method.Method));
                }
            }

            Interfaces.Add(Tuple.Create(interfaceHash, iface));
            return(interfaceHash);
        }
Exemple #4
0
        public Task <TReturn> CallAsyncMethod <TReturn>(RemoteProcedureDescriptor descriptor, params object[] parameters)
        {
            if (_remoteProcedureCaller == null)
            {
                throw new InvalidOperationException();
            }

            var remoteCommand = new RemoteCommand
            {
                RemoteSessionInformation = new RemoteSessionInformation
                {
                    InstanceId = _remoteSessionInformation.InstanceId,
                    ScopeId    = _remoteSessionInformation.ScopeId,
                    ActionId   = Guid.NewGuid()
                },
                RemoteProcedureDescriptor = descriptor,
                Parameters = parameters
            };

            var result = _remoteProcedureCaller.CallMethod(remoteCommand);

            return(Task.FromResult(ConvertResult <TReturn>(result.Result)));
        }
 public Tuple <Type, MethodInfo> FindMethod(RemoteProcedureDescriptor descriptor)
 {
     return(_methods[descriptor.ToGuid()]);
 }