/// <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); } }