Ejemplo n.º 1
0
        internal async Task OnObjectCall(BlockCall request)
        {
            var reply = new BlockReply {
                RequestID = request.RequestID
            };

            try
            {
                if (CanCall(request))
                {
                    var resultStream = new MemoryStream();
                    if (request.ObjectID < 0)
                    {
                        OnChannelCall(request, resultStream);
                    }
                    else
                    {
                        _serviceCache.CallObject(request, resultStream);
                    }
                    reply.Success    = true;
                    reply.DataStream = resultStream;
                }
                else
                {
                    var ex = new UnauthorizedAccessException("Access token error");
                    reply = BlockReply.BuildFromException(ex, request.RequestID);
                }
            }
            catch (Exception ex)
            {
                reply = BlockReply.BuildFromException(ex, request.RequestID);
            }
            await SendBlockAsync(reply);
        }
Ejemplo n.º 2
0
        public async Task <MemoryStream> SendCallRequestAsync(Int16 objectID, Int16 methodID, byte[] requestData)
        {
            ResponseTicket ticket;

            lock (_pendingRequests)
            {
                ticket = _ticketPool.Get();
                ticket.Reset(forAsync: true);
                _pendingRequests[ticket.RequestSerial] = ticket;
            }

            try
            {
                Block block = new BlockCall
                {
                    RequestID  = ticket.RequestSerial,
                    ObjectID   = objectID,
                    MethodID   = methodID,
                    DataStream = new MemoryStream(requestData)
                };
                _ = SendBlockAsync(block);
                var result = await ticket.ResponseSource.Task;
                OnTicketDone(ticket);
                return(result);
            }
            catch
            {
                OnTicketDone(ticket);
                throw;
            }
        }
Ejemplo n.º 3
0
        public MemoryStream SendCallRequest(Int16 objectID, Int16 methodID, byte[] requestData)
        {
            ResponseTicket ticket;

            lock (_pendingRequests)
            {
                ticket = _ticketPool.Get();
                ticket.Reset(forAsync: false);
                _pendingRequests[ticket.RequestSerial] = ticket;
            }

            try
            {
                Block block = new BlockCall
                {
                    RequestID  = ticket.RequestSerial,
                    ObjectID   = objectID,
                    MethodID   = methodID,
                    DataStream = new MemoryStream(requestData)
                };
                _ = SendBlockAsync(block);
                return(ticket.GetResponseData());
            }
            finally
            {
                OnTicketDone(ticket);
            }
        }
Ejemplo n.º 4
0
        internal void CallObject(BlockCall block, MemoryStream resultStream)
        {
            var service = FindByID(block.ObjectID);

            if (service != null)
            {
                service.Dispatcher.DispatchMethodCall(block.MethodID, block.DataStream, resultStream);
            }
            else
            {
                throw new NullReferenceException($"Can't find service object with id={block.ObjectID}");
            }
        }
Ejemplo n.º 5
0
 protected virtual bool CanCall(BlockCall block)
 {
     return(true);
 }
Ejemplo n.º 6
0
 protected virtual void OnChannelCall(BlockCall block, MemoryStream resultStream)
 {
 }