public static ServiceBusReceivedMessage AmqpMessageToSBMessage(AmqpMessage amqpMessage, bool isPeeked = false) { Argument.AssertNotNull(amqpMessage, nameof(amqpMessage)); ServiceBusReceivedMessage sbMessage = amqpMessage.ToServiceBusReceivedMessage(); var sections = amqpMessage.Sections; if ((sections & SectionFlag.Header) != 0) { if (amqpMessage.Header.Ttl != null) { sbMessage.SentMessage.TimeToLive = TimeSpan.FromMilliseconds(amqpMessage.Header.Ttl.Value); } if (amqpMessage.Header.DeliveryCount != null) { sbMessage.DeliveryCount = isPeeked ? (int)(amqpMessage.Header.DeliveryCount.Value) : (int)(amqpMessage.Header.DeliveryCount.Value + 1); } } if ((sections & SectionFlag.Properties) != 0) { if (amqpMessage.Properties.MessageId != null) { sbMessage.SentMessage.MessageId = amqpMessage.Properties.MessageId.ToString(); } if (amqpMessage.Properties.CorrelationId != null) { sbMessage.SentMessage.CorrelationId = amqpMessage.Properties.CorrelationId.ToString(); } if (amqpMessage.Properties.ContentType.Value != null) { sbMessage.SentMessage.ContentType = amqpMessage.Properties.ContentType.Value; } if (amqpMessage.Properties.Subject != null) { sbMessage.SentMessage.Label = amqpMessage.Properties.Subject; } if (amqpMessage.Properties.To != null) { sbMessage.SentMessage.To = amqpMessage.Properties.To.ToString(); } if (amqpMessage.Properties.ReplyTo != null) { sbMessage.SentMessage.ReplyTo = amqpMessage.Properties.ReplyTo.ToString(); } if (amqpMessage.Properties.GroupId != null) { sbMessage.SentMessage.SessionId = amqpMessage.Properties.GroupId; } if (amqpMessage.Properties.ReplyToGroupId != null) { sbMessage.SentMessage.ReplyToSessionId = amqpMessage.Properties.ReplyToGroupId; } } // Do application properties before message annotations, because the application properties // can be updated by entries from message annotation. if ((sections & SectionFlag.ApplicationProperties) != 0) { foreach (var pair in amqpMessage.ApplicationProperties.Map) { if (TryGetNetObjectFromAmqpObject(pair.Value, MappingType.ApplicationProperty, out var netObject)) { sbMessage.SentMessage.Properties[pair.Key.ToString()] = netObject; } } } if ((sections & SectionFlag.MessageAnnotations) != 0) { foreach (var pair in amqpMessage.MessageAnnotations.Map) { var key = pair.Key.ToString(); switch (key) { case EnqueuedTimeUtcName: sbMessage.EnqueuedTime = (DateTime)pair.Value; break; case ScheduledEnqueueTimeUtcName: sbMessage.SentMessage.ScheduledEnqueueTime = (DateTime)pair.Value; break; case SequenceNumberName: sbMessage.SequenceNumber = (long)pair.Value; break; case EnqueueSequenceNumberName: sbMessage.EnqueuedSequenceNumber = (long)pair.Value; break; case LockedUntilName: sbMessage.LockedUntil = (DateTime)pair.Value >= DateTimeOffset.MaxValue.UtcDateTime ? DateTimeOffset.MaxValue : (DateTime)pair.Value; break; case PartitionKeyName: sbMessage.SentMessage.PartitionKey = (string)pair.Value; break; case PartitionIdName: sbMessage.PartitionId = (short)pair.Value; break; case ViaPartitionKeyName: sbMessage.SentMessage.ViaPartitionKey = (string)pair.Value; break; case DeadLetterSourceName: sbMessage.DeadLetterSource = (string)pair.Value; break; default: if (TryGetNetObjectFromAmqpObject(pair.Value, MappingType.ApplicationProperty, out var netObject)) { sbMessage.SentMessage.Properties[key] = netObject; } break; } } } if (amqpMessage.DeliveryTag.Count == GuidSize) { var guidBuffer = new byte[GuidSize]; Buffer.BlockCopy(amqpMessage.DeliveryTag.Array, amqpMessage.DeliveryTag.Offset, guidBuffer, 0, GuidSize); sbMessage.LockTokenGuid = new Guid(guidBuffer); } amqpMessage.Dispose(); return(sbMessage); }