Пример #1
0
        public void Raise(object[] arguments)
        {
            IEnumerable <ISubscription> subscriptions;

            lock (_subscriptions)
            {
                subscriptions = _subscriptions.Keys.ToArray();
            }

            var payload = Payload.Create(arguments, o => _objectsRepository.TryGetObjectId(o, out var objectId) ? objectId : null);

            foreach (var subscription in subscriptions)
            {
                //TODO: optimization is needed to avoid serialization for each subscriber
                var eventMessage = payload.CreateEventMessage(_serializer, subscription.ClientHostAddress, _objectId, _eventName);
                subscription.Handler.DynamicInvoke(eventMessage);
            }
        }
Пример #2
0
        private void HandleRequest(IHostAddress clientHostAddress, IInputContext context, string methodName,
                                   object[] parameters)
        {
            if (_disposed)
            {
                throw new ObjectDisposedException(nameof(ObjectAdapter));
            }

            var operationDescription = _contractDescription.GetOperationDescription(methodName, parameters);

            object result;

            try
            {
                result = _synchronizationContext != null
                    ? CallInSyncContext(operationDescription, parameters)
                    : operationDescription.Method.Invoke(Object, parameters.ToArray());
            }
            catch (Exception e)
            {
                //Send exception back to client
                WriteException(context, e.InnerException ?? e, clientHostAddress);
                return;
            }

            if (_objectsRepository.TryGetObjectId(result, out var objectId))
            {
                var responseMessage = new ResponseMessage(clientHostAddress, new byte[] { }, new [] { true }, new[] { objectId });
                context.Write(responseMessage.ToFrame());
            }
            else
            {
                var payload         = _serializer.Serialize(result);
                var responseMessage = new ResponseMessage(clientHostAddress, payload, new [] { false }, new string[] { });
                context.Write(responseMessage.ToFrame());
            }
        }