public async Task <StatusCode> LongrunningPassthroughAsync(string recipientId, string passthroughName, byte[]?dataToSend, Action <Ssz.Utils.DataAccess.LongrunningPassthroughCallback>?callbackAction) { if (_disposed) { throw new ObjectDisposedException("Cannot access a disposed Context."); } if (!ServerContextIsOperational) { throw new InvalidOperationException(); } string invokeId = Guid.NewGuid().ToString(); try { var incompleteLongrunningPassthroughRequest = new IncompleteLongrunningPassthroughRequest { CallbackAction = callbackAction }; lock (_incompleteLongrunningPassthroughRequestsCollection) { _incompleteLongrunningPassthroughRequestsCollection.Add(invokeId, incompleteLongrunningPassthroughRequest); } var passthroughDataToSendFull = new PassthroughData(); if (dataToSend is not null) { passthroughDataToSendFull.Data = ByteString.CopyFrom(dataToSend); } foreach (var passthroughDataToSend in passthroughDataToSendFull.SplitForCorrectGrpcMessageSize()) { var request = new LongrunningPassthroughRequest { InvokeId = invokeId, ContextId = _serverContextId, RecipientId = recipientId, PassthroughName = passthroughName, DataToSend = passthroughDataToSend }; LongrunningPassthroughReply reply = await _resourceManagementClient.LongrunningPassthroughAsync(request); SetResourceManagementLastCallUtc(); } return(await incompleteLongrunningPassthroughRequest.TaskCompletionSource.Task); } catch (Exception ex) { lock (_incompleteLongrunningPassthroughRequestsCollection) { _incompleteLongrunningPassthroughRequestsCollection.Remove(invokeId); } ProcessRemoteMethodCallException(ex); throw; } }
public void Passthrough(string recipientId, string passthroughName, byte[] dataToSend, out IEnumerable <byte> returnData) { if (_disposed) { throw new ObjectDisposedException("Cannot access a disposed Context."); } if (!ServerContextIsOperational) { throw new InvalidOperationException(); } try { var passthroughDataToSendFull = new PassthroughData(); passthroughDataToSendFull.Data = ByteString.CopyFrom(dataToSend); returnData = new byte[0]; foreach (var passthroughDataToSend in passthroughDataToSendFull.SplitForCorrectGrpcMessageSize()) { var request = new PassthroughRequest { ContextId = _serverContextId, RecipientId = recipientId, PassthroughName = passthroughName, DataToSend = passthroughDataToSend }; while (true) { PassthroughReply reply = _resourceManagementClient.Passthrough(request); request.DataToSend = new PassthroughData(); SetResourceManagementLastCallUtc(); IEnumerable <byte>?returnDataTemp = null; if (!String.IsNullOrEmpty(reply.ReturnData.Guid) && _incompletePassthroughRepliesCollection.Count > 0) { var beginPassthroughReply = _incompletePassthroughRepliesCollection.TryGetValue(reply.ReturnData.Guid); if (beginPassthroughReply is not null) { _incompletePassthroughRepliesCollection.Remove(reply.ReturnData.Guid); returnDataTemp = beginPassthroughReply.Concat(reply.ReturnData.Data); } } if (returnDataTemp is null) { returnDataTemp = reply.ReturnData.Data; } if (!String.IsNullOrEmpty(reply.ReturnData.NextGuid)) { _incompletePassthroughRepliesCollection[reply.ReturnData.NextGuid] = returnDataTemp; request = new PassthroughRequest { ContextId = _serverContextId }; continue; } returnData = returnDataTemp; break; } } } catch (Exception ex) { ProcessRemoteMethodCallException(ex); throw; } }