diff --git a/sdk/servicebus/Azure.Messaging.ServiceBus/api/Azure.Messaging.ServiceBus.netstandard2.0.cs b/sdk/servicebus/Azure.Messaging.ServiceBus/api/Azure.Messaging.ServiceBus.netstandard2.0.cs index a99f42264501..130361ff0e8a 100644 --- a/sdk/servicebus/Azure.Messaging.ServiceBus/api/Azure.Messaging.ServiceBus.netstandard2.0.cs +++ b/sdk/servicebus/Azure.Messaging.ServiceBus/api/Azure.Messaging.ServiceBus.netstandard2.0.cs @@ -204,6 +204,7 @@ public enum ServiceBusFailureReason public partial class ServiceBusMessage { public ServiceBusMessage() { } + public ServiceBusMessage(Azure.Core.Amqp.AmqpAnnotatedMessage message) { } public ServiceBusMessage(Azure.Messaging.ServiceBus.ServiceBusReceivedMessage receivedMessage) { } public ServiceBusMessage(System.BinaryData body) { } public ServiceBusMessage(System.ReadOnlyMemory body) { } diff --git a/sdk/servicebus/Azure.Messaging.ServiceBus/src/Primitives/ServiceBusMessage.cs b/sdk/servicebus/Azure.Messaging.ServiceBus/src/Primitives/ServiceBusMessage.cs index 99540852043c..dc0d3f52cdef 100755 --- a/sdk/servicebus/Azure.Messaging.ServiceBus/src/Primitives/ServiceBusMessage.cs +++ b/sdk/servicebus/Azure.Messaging.ServiceBus/src/Primitives/ServiceBusMessage.cs @@ -143,6 +143,15 @@ public ServiceBusMessage(ServiceBusReceivedMessage receivedMessage) } } + /// + /// Creates a new message from the specified instance. + /// + /// The AMQP message. + public ServiceBusMessage(AmqpAnnotatedMessage message) + { + AmqpMessage = message; + } + /// /// Gets or sets the body of the message. /// @@ -411,7 +420,7 @@ public DateTimeOffset ScheduledEnqueueTime internal AmqpAnnotatedMessage AmqpMessage { get; set; } /// - /// Gets the raw Amqp message data that will be transmitted over the wire. + /// Gets the raw AMQP message data that will be transmitted over the wire. /// This can be used to enable scenarios that require setting AMQP header, footer, property, or annotation /// data that is not exposed as top level properties in the . /// diff --git a/sdk/servicebus/Azure.Messaging.ServiceBus/tests/Message/MessageTests.cs b/sdk/servicebus/Azure.Messaging.ServiceBus/tests/Message/MessageTests.cs index 3b8e0148516d..c4c69b98be7b 100644 --- a/sdk/servicebus/Azure.Messaging.ServiceBus/tests/Message/MessageTests.cs +++ b/sdk/servicebus/Azure.Messaging.ServiceBus/tests/Message/MessageTests.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Text; using Azure.Core; +using Azure.Core.Amqp; using NUnit.Framework; namespace Azure.Messaging.ServiceBus.Tests.Message @@ -264,5 +265,47 @@ public void CreateReceivedMessageViaFactory() Assert.AreEqual(7632, receivedMessage.EnqueuedSequenceNumber); Assert.AreEqual(new DateTimeOffset(fixedDate, TimeSpan.FromSeconds(120)).UtcDateTime, receivedMessage.EnqueuedTime.UtcDateTime); } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void CanSerializeDeserializeAmqpBytes(bool useSession) + { + var message = new ServiceBusMessage(new BinaryData(ServiceBusTestUtilities.GetRandomBuffer(100))); + message.ContentType = "contenttype"; + message.CorrelationId = "correlationid"; + message.Subject = "label"; + message.MessageId = "messageId"; + message.PartitionKey = "key"; + message.ApplicationProperties.Add("testProp", "my prop"); + message.ReplyTo = "replyto"; + + message.ScheduledEnqueueTime = DateTimeOffset.Now; + if (useSession) + { + message.SessionId = "key"; + message.ReplyToSessionId = "replytosession"; + } + + message.TimeToLive = TimeSpan.FromSeconds(60); + message.To = "to"; + + var serialized = message.GetRawAmqpMessage().ToBytes(); + + var deserialized = new ServiceBusMessage(AmqpAnnotatedMessage.FromBytes(serialized)); + Assert.AreEqual(message.ContentType, deserialized.ContentType); + Assert.AreEqual(message.CorrelationId, deserialized.CorrelationId); + Assert.AreEqual(message.Subject, deserialized.Subject); + Assert.AreEqual(message.MessageId, deserialized.MessageId); + Assert.AreEqual(message.PartitionKey, deserialized.PartitionKey); + Assert.AreEqual(message.ApplicationProperties["testProp"], deserialized.ApplicationProperties["testProp"]); + Assert.AreEqual(message.ReplyTo, deserialized.ReplyTo); + Assert.AreEqual(message.ReplyToSessionId, deserialized.ReplyToSessionId); + // because AMQP only has millisecond resolution, allow for up to a 1ms difference when round-tripping + Assert.That(deserialized.ScheduledEnqueueTime, Is.EqualTo(message.ScheduledEnqueueTime).Within(1).Milliseconds); + Assert.AreEqual(message.SessionId, deserialized.SessionId); + Assert.AreEqual(message.TimeToLive, deserialized.TimeToLive); + Assert.AreEqual(message.To, deserialized.To); + } } }