public static Message AsWcfMessage(this RabbitMqMessage currentRabbitMqMessage, long parentMaxReceivedMessageSize, BufferManager parentBufferManager, MessageEncoderFactory messageEncoderFactory)
        {
            Debug.Assert(currentRabbitMqMessage != null);
            byte[] data;
            long   bytesTotal;

            using (Stream stream = new MemoryStream())
            {
                stream.Write(currentRabbitMqMessage.Body, 0, currentRabbitMqMessage.Body.Length);

                stream.Position = 0;

                bytesTotal = stream.Length;

                if (bytesTotal > int.MaxValue)
                {
                    throw new CommunicationException(
                              $"Message of size {bytesTotal} bytes is too large to buffer. Use a streamed transfer instead.");
                }

                if (bytesTotal > parentMaxReceivedMessageSize)
                {
                    throw new CommunicationException(
                              $"Message exceeds maximum size: {bytesTotal} > {parentMaxReceivedMessageSize}.");
                }

                data = parentBufferManager.TakeBuffer((int)bytesTotal);

                var bytesRead = 0;

                while (bytesRead < bytesTotal)
                {
                    var count = stream.Read(data, bytesRead, (int)bytesTotal - bytesRead);

                    if (count == 0)
                    {
                        throw new CommunicationException($"Unexpected end of message after {bytesRead} of {bytesTotal} bytes.");
                    }

                    bytesRead += count;
                }
            }

            var buffer = new ArraySegment <byte>(data, 0, (int)bytesTotal);

            var message = messageEncoderFactory.Encoder.ReadMessage(buffer, parentBufferManager);

            parentBufferManager.ReturnBuffer(data);

            return(message);
        }
        internal static RabbitMqMessage AsRabbitMqMessage(this Message message)
        {
            RabbitMqMessage rabbitMsg;

            using (Stream stream = new MemoryStream())
            {
                var writer = XmlWriter.Create(stream);

                message.WriteMessage(writer);

                writer.Flush();

                stream.Position = 0;

                var bytes = new byte[stream.Length];

                stream.Read(bytes, 0, (int)stream.Length);

                var actionComponents = message.Headers.Action.Split('/');
                var serviceName      = actionComponents[actionComponents.Length - 2];
                var correlationId    = Guid.NewGuid().ToString();
                var replyTopic       = $"{serviceName}{ServiceConfiguration.ReplyExchangeSuffix}";

                IBasicProperties props = new BasicProperties
                {
                    MessageId     = message.Headers.MessageId?.ToString() ?? Guid.NewGuid().ToString(),
                    CorrelationId = correlationId,
                    ReplyTo       = replyTopic,
                    Headers       = new Dictionary <string, object>()
                };

                rabbitMsg = new RabbitMqMessage
                {
                    Body            = bytes,
                    Topic           = $"{serviceName}{ServiceConfiguration.DirectExchangeSuffix}",
                    ReplyTopic      = replyTopic,
                    ReplyRoutingKey = "",
                    RoutingKey      = ServiceConfiguration.ServiceProcessingRoute,
                    Properties      = props,
                    CorrelationId   = correlationId
                };
            }
            return(rabbitMsg);
        }