/// <summary> /// Creates a new message from the specified received message by copying the properties. /// </summary> /// <param name="receivedMessage">The received message to copy the data from.</param> public ServiceBusMessage(ServiceBusReceivedMessage receivedMessage) { Argument.AssertNotNull(receivedMessage, nameof(receivedMessage)); if (!receivedMessage.AmqpMessage.Body.TryGetData(out IEnumerable <ReadOnlyMemory <byte> > dataBody)) { throw new NotSupportedException($"{receivedMessage.AmqpMessage.Body.BodyType} is not a supported message body type."); } AmqpMessageBody body = new AmqpMessageBody(BodyMemory.FromReadOnlyMemory(dataBody)); AmqpMessage = new AmqpAnnotatedMessage(body); // copy properties AmqpMessageProperties properties = AmqpMessage.Properties; AmqpMessageProperties receivedProperties = receivedMessage.AmqpMessage.Properties; properties.MessageId = receivedProperties.MessageId; properties.UserId = receivedProperties.UserId; properties.To = receivedProperties.To; properties.Subject = receivedProperties.Subject; properties.ReplyTo = receivedProperties.ReplyTo; properties.CorrelationId = receivedProperties.CorrelationId; properties.ContentType = receivedProperties.ContentType; properties.ContentEncoding = receivedProperties.ContentEncoding; properties.AbsoluteExpiryTime = receivedProperties.AbsoluteExpiryTime; properties.CreationTime = receivedProperties.CreationTime; properties.GroupId = receivedProperties.GroupId; properties.GroupSequence = receivedProperties.GroupSequence; properties.ReplyToGroupId = receivedProperties.ReplyToGroupId; // copy header except for delivery count which should be set to null AmqpMessageHeader header = AmqpMessage.Header; AmqpMessageHeader receivedHeader = receivedMessage.AmqpMessage.Header; header.DeliveryCount = null; header.Durable = receivedHeader.Durable; header.Priority = receivedHeader.Priority; header.TimeToLive = receivedHeader.TimeToLive; header.FirstAcquirer = receivedHeader.FirstAcquirer; // copy message annotations except for broker set ones foreach (KeyValuePair <string, object> kvp in receivedMessage.AmqpMessage.MessageAnnotations) { if (kvp.Key == AmqpMessageConstants.LockedUntilName || kvp.Key == AmqpMessageConstants.SequenceNumberName || kvp.Key == AmqpMessageConstants.DeadLetterSourceName || kvp.Key == AmqpMessageConstants.EnqueueSequenceNumberName || kvp.Key == AmqpMessageConstants.EnqueuedTimeUtcName) { continue; } AmqpMessage.MessageAnnotations.Add(kvp.Key, kvp.Value); } // copy delivery annotations foreach (KeyValuePair <string, object> kvp in receivedMessage.AmqpMessage.DeliveryAnnotations) { AmqpMessage.DeliveryAnnotations.Add(kvp.Key, kvp.Value); } // copy footer foreach (KeyValuePair <string, object> kvp in receivedMessage.AmqpMessage.Footer) { AmqpMessage.Footer.Add(kvp.Key, kvp.Value); } // copy application properties except for broker set ones foreach (KeyValuePair <string, object> kvp in receivedMessage.AmqpMessage.ApplicationProperties) { if (kvp.Key == AmqpMessageConstants.DeadLetterReasonHeader || kvp.Key == AmqpMessageConstants.DeadLetterErrorDescriptionHeader) { continue; } AmqpMessage.ApplicationProperties.Add(kvp.Key, kvp.Value); } }
/// <summary> /// Creates a new message from the specified payload. /// </summary> /// <param name="body">The payload of the message in bytes.</param> public ServiceBusMessage(ReadOnlyMemory <byte> body) { AmqpMessageBody amqpBody = new AmqpMessageBody(BodyMemory.FromReadOnlyMemory(new ReadOnlyMemory <byte>[] { body })); AmqpMessage = new AmqpAnnotatedMessage(amqpBody); }