Beispiel #1
0
        public void Intercept(IInvocation invocation)
        {
            if (_disposed)
            {
                throw new ObjectDisposedException(nameof(ClientInterceptor));
            }

            if (invocation.Method.Name == nameof(Dispose) && invocation.Arguments.Length == 0)
            {
                Dispose();
                return;
            }

            if (invocation.Method.IsSpecialName)
            {
                HandleSpecialName(invocation);
            }
            else
            {
                var operation = _contractDescription.GetOperationDescription(invocation.Method.Name, invocation.Arguments);

                if (operation.Method.ReturnType == typeof(void) && operation.IsOneWay)
                {
                    Notify(operation.Name, invocation.Arguments);
                }
                else
                {
                    invocation.ReturnValue = Call(operation.Name, invocation.Arguments);
                }
            }
        }
Beispiel #2
0
        public object Call(string methodName, object[] parameters)
        {
            var payload        = Payload.Create(parameters, o => _eloquentClient.TryGetObjectId(o, out var id) ? id : null);
            var requestMessage = payload.CreateRequestMessage(_serializer, _clientHostAddress, _objectId, methodName);

            var result = _outputChannel.SendAndReceive(requestMessage);

            switch (result)
            {
            case ErrorMessage errorMessage:
                throw errorMessage.ToException();

            case ExceptionMessage exceptionMessage:
                throw exceptionMessage.Exception;

            case ResponseMessage responseMessage:
                if (responseMessage.Selector[0])
                {
                    var objectType = _contractDescription.GetOperationDescription(methodName, parameters).Method.ReturnType;
                    return(_eloquentClient.Connect(objectType, responseMessage.ObjectIds[0]));
                }
                else
                {
                    return(_serializer.Deserialize(responseMessage.SerializedParameters).Single());
                }

            default:
                throw new IOException($"Unexpected session message type: {result.MessageType}");
            }
        }
Beispiel #3
0
        private void HandleEvent(string eventName, object[] arguments)
        {
            if (_disposed)
            {
                throw new ObjectDisposedException(nameof(ObjectAdapter));
            }

            var operationDescription = _contractDescription.GetOperationDescription(eventName, arguments);

            if (_synchronizationContext != null)
            {
                _synchronizationContext.Post(
                    s => { operationDescription.Method.Invoke(Object, arguments); },
                    null);

                return;
            }

            operationDescription.Method.Invoke(Object, arguments);
        }