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); }
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; } }
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); } }
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}"); } }
protected virtual bool CanCall(BlockCall block) { return(true); }
protected virtual void OnChannelCall(BlockCall block, MemoryStream resultStream) { }