From 6b68d62a4e1f90525b25d8e55d066e4980695c4a Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Fri, 11 Nov 2016 13:21:13 -0700 Subject: [PATCH] mimic brokered message "cloning" when body type is a byte array (ASB limitation) --- Forms/MessageForm.Designer.cs | 3 ++- Forms/MessageForm.cs | 13 ++++++++++++- Helpers/BrokeredMessageExtensions.cs | 26 ++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/Forms/MessageForm.Designer.cs b/Forms/MessageForm.Designer.cs index 4761569f..a6203973 100644 --- a/Forms/MessageForm.Designer.cs +++ b/Forms/MessageForm.Designer.cs @@ -315,7 +315,8 @@ private void InitializeComponent() this.cboBodyType.Items.AddRange(new object[] { "Stream", "String", - "WCF"}); + "WCF", + "ByteArray"}); this.cboBodyType.Location = new System.Drawing.Point(536, 509); this.cboBodyType.Name = "cboBodyType"; this.cboBodyType.Size = new System.Drawing.Size(88, 21); diff --git a/Forms/MessageForm.cs b/Forms/MessageForm.cs index 10f5be41..d2cee86b 100644 --- a/Forms/MessageForm.cs +++ b/Forms/MessageForm.cs @@ -285,7 +285,18 @@ private void btnSubmit_Click(object sender, EventArgs e) } else { - outboundMessage = serviceBusHelper.CreateMessageForApiReceiver(brokeredMessage.Clone(txtMessageText.Text), + BrokeredMessage message; + // For body type ByteArray cloning is not an option. When cloned, supplied body can be only of a string or stream types, but not byte array :( + if (bodyType == BodyType.ByteArray) + { + message = brokeredMessage.CloneWithByteArrayBodyType(txtMessageText.Text); + } + else + { + message = brokeredMessage.Clone(txtMessageText.Text); + } + + outboundMessage = serviceBusHelper.CreateMessageForApiReceiver(message, 0, false, false, diff --git a/Helpers/BrokeredMessageExtensions.cs b/Helpers/BrokeredMessageExtensions.cs index 8f705585..58786b19 100644 --- a/Helpers/BrokeredMessageExtensions.cs +++ b/Helpers/BrokeredMessageExtensions.cs @@ -24,6 +24,7 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Text; using Microsoft.ServiceBus.Messaging; #endregion @@ -73,6 +74,31 @@ public static BrokeredMessage Clone(this BrokeredMessage message, string text) return clone; } + public static BrokeredMessage CloneWithByteArrayBodyType(this BrokeredMessage originalMessage, string text) + { + var bytes = Encoding.UTF8.GetBytes(text); + var message = new BrokeredMessage(bytes); + + // Copy all custom properties + foreach (var header in originalMessage.Properties) + { + // Recovery header should not be included + if (header.Key != "NServiceBus.Transport.Recovery") + { + message.Properties[header.Key] = header.Value; + } + } + + // Required standard properties + message.CorrelationId = originalMessage.CorrelationId; + message.ReplyTo = originalMessage.ReplyTo; + message.TimeToLive = originalMessage.TimeToLive; + message.ScheduledEnqueueTimeUtc = originalMessage.ScheduledEnqueueTimeUtc; + message.ViaPartitionKey = originalMessage.ViaPartitionKey; + + return message; + } + public static Stream GetBodyStream(this BrokeredMessage message) { return bodyStreamPropertyInfo.GetValue(message) as Stream;