Formatting the content for Service Bus messages
A message broker has to deal with scenarios where clients are using different protocol and client library versions to send and receive messages. In addition different platforms and protocols have varying support for serialization. For Windows Azure Service Bus, following are some examples of using different methods to create messages to send to Topics and Queues, and the corresponding approaches that can be used to receive the messages from Queues and Subscriptions.
If you are using REST protocol to send messages and receive them thru .NET API then you can directly manipulate the message body as:
Stream bodyStream = receiveMessage.GetBody<Stream>();
The following examples apply when using the .NET API to send and receive messages.
Example 1: Using string
When creating a BrokeredMessage with a string and the default (DataContract + Binary) serializer:
BrokeredMessage stringDefaultMessage = new BrokeredMessage("default string");
You can receive this message as:
string s = receiveMessage.GetBody<string>();
Example 2: Using Text instead of Binary XML in DataContractSerializer
When creating a BrokeredMessage with a string and a DataContractSerializer and use Text instead of Binary Xml:
BrokeredMessage stringDataContractMessage = new BrokeredMessage("DataContract string", new DataContractSerializer(typeof(string)));
You can receive this message as:
string s = receiveMessage.GetBody<string>(new DataContractSerializer(typeof(string)))
Example 3: Using raw UTF8 string
When creating a BrokeredMessage with just a raw UTF 8 string:
string utf8String = "raw UTF8 string";
BrokeredMessage utf8StringMessage = new BrokeredMessage(new MemoryStream(Encoding.UTF8.GetBytes(utf8String)), true);
You can receive this message as:
string s = new StreamReader(receiveMessage.GetBody<Stream>(), Encoding.UTF8).ReadToEnd();
Example 4: Using raw UTF16
When creating a BrokeredMessage with just a raw UTF16 (“Unicode”) string:
string utf16String = "raw UTF16 string";
BrokeredMessage utf16StringMessage = new BrokeredMessage(new MemoryStream(Encoding.Unicode.GetBytes(utf16String)), true);
You can receive this message as:
string s = new StreamReader(receiveMessage.GetBody<Stream>(), Encoding.Unicode).ReadToEnd();
Example 5: Using a custom DataContract
When creating a BrokeredMessage using custom DataContract type and using default serializer (DataContract + Binary Xml):
[DataContract(Namespace = "")]
class Record {
[DataMember]
public string Id { get; set; }
}
[…]
Record recordDefault = new Record { Id = "default Record" };
BrokeredMessage recordDefaultMessage = new BrokeredMessage(recordDefault);
You can receive this message as:
Record r = receiveMessage.GetBody<Record>();
Example 6: Using custom DataContract and Text
When creating a BrokeredMessage using custom DataContract type and using DataContractSerializer (will use Text Xml instead of Binary):
Record recordDataContract = new Record { Id = "DataContract Record" };
BrokeredMessage recordDataContractMessage = new BrokeredMessage(recordDataContract, new DataContractSerializer(typeof(Record)));
You can receive this message as:
Record r = receiveMessage.GetBody<Record>(new DataContractSerializer(typeof(Record)));
Trackbacks & Pingbacks
- Receiving messages using NetMessagingBinding with custom formats | Rock - Paper - Scissors - Cloud!
- BrokeredMessage Deseralization comes with unwanted String | Stackforum
- Send Messages from TopicClient to WCF Subscription Service - Windows Azure Cloud Integration Engineering - Site Home - MSDN Blogs
Thanks. Your post did make my day. I am now able to serialize objects on an Android device, send them to ServiceBus, and deserialize them on a .Net listener.
But what bothers me: It looks that when you supply an XObjectSerializer to the message.GetBody and initialize this serializer with a DataContractSerializer initilialized with some arbitrary type, the whole thing switches from XML Binary to XML Text. Is this documented somewhere?
Thank you for the post. What should be the approach for receiving different custom data contract and evaluate its type?
This worked great! I’m publishing messages from the PHP SDK (wordpress site). Then receiving them with a worker role in .Net. GetBody to the rescue!
Your own post, “Formatting the content for Service Bus messages | Rock – Paper – Scissors – Cloud!
” was in fact very well worth commenting down here
in the comment section! Basically needed to mention you actually did a wonderful job.
Thanks for your effort -Richard