/// <summary>
        /// Synchronously serializes the given <see cref="AS4Message"/> to a given <paramref name="output"/> stream.
        /// </summary>
        /// <param name="message">The message to serialize.</param>
        /// <param name="output">The destination stream to where the message should be written.</param>
        /// <param name="cancellation">The token to control the cancellation of the serialization.</param>
        public void Serialize(
            AS4Message message,
            Stream output,
            CancellationToken cancellation = default(CancellationToken))
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            if (output == null)
            {
                throw new ArgumentNullException(nameof(output));
            }

            var builder = new SoapEnvelopeBuilder(message.EnvelopeDocument);

            XmlNode securityHeader = GetSecurityHeader(message);

            if (securityHeader != null)
            {
                builder.SetSecurityHeader(securityHeader);
            }

            if (message.EnvelopeDocument == null)
            {
                SetMultiHopHeaders(builder, message);

                Messaging messagingHeader = CreateMessagingHeader(message);

                builder.SetMessagingHeader(messagingHeader);
                builder.SetMessagingBody(message.SigningId.BodySecurityId);
            }

            using (XmlWriter writer = XmlWriter.Create(output, DefaultXmlWriterSettings))
            {
                builder.Build().WriteTo(writer);
            }
        }
        private static void SetMultiHopHeaders(SoapEnvelopeBuilder builder, AS4Message as4Message)
        {
            if (as4Message.IsSignalMessage && as4Message.FirstSignalMessage.IsMultihopSignal)
            {
                var to = new To {
                    Role = Constants.Namespaces.EbmsNextMsh
                };
                builder.SetToHeader(to);

                string actionValue = as4Message.FirstSignalMessage.MultihopAction;
                builder.SetActionHeader(actionValue);

                var routingInput = new RoutingInput
                {
                    UserMessage                   = as4Message.FirstSignalMessage.MultiHopRouting.UnsafeGet,
                    mustUnderstand                = false,
                    mustUnderstandSpecified       = true,
                    IsReferenceParameter          = true,
                    IsReferenceParameterSpecified = true
                };

                builder.SetRoutingInput(routingInput);
            }
        }