private IMessage DoSendAndReceive(IMessage request, IMessageChannel channel)
        {
            TemporaryReplyChannel replyChannel = new TemporaryReplyChannel(_receiveTimeout);

            request = MessageBuilder.FromMessage(request)
                      .SetReplyChannel(replyChannel)
                      .SetErrorChannel(replyChannel)
                      .Build();
            if (!DoSend(request, channel))
            {
                return(null);
            }
            return(DoReceive(replyChannel));
        }
        protected override IMessage DoSendAndReceive(IMessageChannel channel, IMessage requestMessage)
        {
            if (channel == null)
            {
                throw new ArgumentNullException(nameof(channel));
            }

            var originalReplyChannelHeader = requestMessage.Headers.ReplyChannel;
            var originalErrorChannelHeader = requestMessage.Headers.ErrorChannel;

            var sendTimeout    = GetSendTimeout(requestMessage);
            var receiveTimeout = GetReceiveTimeout(requestMessage);

            var tempReplyChannel = new TemporaryReplyChannel(_throwExceptionOnLateReply);

            requestMessage = MessageBuilder.FromMessage(requestMessage).SetReplyChannel(tempReplyChannel)
                             .SetHeader(_sendTimeoutHeader, null)
                             .SetHeader(_receiveTimeoutHeader, null)
                             .SetErrorChannel(tempReplyChannel).Build();

            try
            {
                DoSend(channel, requestMessage, sendTimeout);
            }
            catch (Exception)
            {
                tempReplyChannel.SendFailed = true;
                throw;
            }

            var replyMessage = DoReceive(tempReplyChannel, receiveTimeout);

            if (replyMessage != null)
            {
                replyMessage = MessageBuilder.FromMessage(replyMessage)
                               .SetHeader(MessageHeaders.REPLY_CHANNEL, originalReplyChannelHeader)
                               .SetHeader(MessageHeaders.ERROR_CHANNEL, originalErrorChannelHeader)
                               .Build();
            }

            return(replyMessage);
        }
        protected async Task <IMessage> DoSendAndReceiveInternalAsync(IMessageChannel channel, IMessage requestMessage, CancellationToken cancellationToken = default)
        {
            var originalReplyChannelHeader = requestMessage.Headers.ReplyChannel;
            var originalErrorChannelHeader = requestMessage.Headers.ErrorChannel;

            var sendTimeout    = GetSendTimeout(requestMessage);
            var receiveTimeout = GetReceiveTimeout(requestMessage);

            var tempReplyChannel = new TemporaryReplyChannel(_throwExceptionOnLateReply);

            requestMessage = MessageBuilder.FromMessage(requestMessage).SetReplyChannel(tempReplyChannel)
                             .SetHeader(_sendTimeoutHeader, null)
                             .SetHeader(_receiveTimeoutHeader, null)
                             .SetErrorChannel(tempReplyChannel).Build();

            try
            {
                await DoSendAsync(channel, requestMessage, sendTimeout, cancellationToken);
            }
            catch (Exception)
            {
                tempReplyChannel.SendFailed = true;
                throw;
            }

            var replyMessage = await DoReceiveAsync(tempReplyChannel, receiveTimeout, cancellationToken);

            if (replyMessage != null)
            {
                replyMessage = MessageBuilder.FromMessage(replyMessage)
                               .SetHeader(MessageHeaders.REPLY_CHANNEL, originalReplyChannelHeader)
                               .SetHeader(MessageHeaders.ERROR_CHANNEL, originalErrorChannelHeader)
                               .Build();
            }

            return(replyMessage);
        }