在Azure的服务总线BrokeredMessage机构编码 [英] Encoding of BrokeredMessage Body in Azure Service Bus
问题描述
我们有大约在Azure服务总线客户端以下包装:
公共虚拟无效的SendMessage(对象bodyObject)
{
VAR brokeredMessage =
_messageBodySerializer.SerializeMessageBody(bodyObject); _queueClient.Send(brokeredMessage);
}
随着 SerializeMessageBody
包括:
公共BrokeredMessage SerializeMessageBody(对象bodyObject)
{
VAR brokeredMessage =新BrokeredMessage(bodyObject); brokeredMessage.Properties [MESSAGE_TYPE_PROPERTY_KEY] =
bodyObject.GetType()AssemblyQualifiedName。 返回brokeredMessage;
}
我写一个集成测试来检查这个工程通过运行 SendMessage函数
然后使用的服务总线浏览器2.0 。我们这样做是为了确保我们能够修复并使用工具来修改XML重新发送消息。消息我送这个样子的:
[DataContract]
公共类TestServiceBusMessage
{
[数据成员]
公众的Guid ExternalIdentifier {搞定;组; } [数据成员]
公众诠释标识{搞定;组; } [数据成员]
公共字符串名称{;组; }
}
问题是;当邮件正文的工具看,而不是看起来像XML它,而不是出来象下面这样:
<$p$p><$c$c>@TestServiceBusMessageWhttp://schemas.datacontract.org/2004/07/IntegrationTests.Common.Azure.ServiceBus i)http://www.w3.org/2001/XMLSchema-instance@ExternalIdentifier?$13d81b90-d932-437f-a11c-9106412b6c4a@标识符和放大器?; @名称?测试消息
我想这是一个编码问题;不过,我看不到的方式来设置通过身体到 BrokeredMessage
构造函数时编码;或定义它通过 DataContract
属性。
我将如何解决这个问题的编码?我需要提供我自己的串行 /的流或有没有办法强制默认的序列化EN code是否正确?
请尝试以下code。我测试了它,我可以用我的工具(Service Bus的资源管理器中看到XML格式的有效载荷:的http://$c$c.msdn.microsoft.com/windowsazure/Service-Bus-Explorer-f2abca5a#content).
基本上,你需要明确指定的DataContractSerializer在BrokeredMessage对象的构造函数。希望这可以帮助。
再见
保罗
的#region MyRegion
使用系统;
使用System.Runtime.Serialization;
使用Microsoft.ServiceBus;
使用Microsoft.ServiceBus.Messaging;
#endregion空间计算器
{
静态类节目
{
#地区的私人常量
私人常量字符串QUEUENAME =计算器;
私人常量字符串消息类型=消息类型;
私人常量字符串的AssemblyName =的AssemblyName
私人常量字符串的ConnectionString =&lt;您服务总线的命名空间的ConnectionString&gt;中;
#endregion #区域静态方法
静态无效的主要()
{
发信息();
} 异步静态无效的SendMessage()
{
尝试
{
//创建NamespaceManager对象
VAR namespaceManager = NamespaceManager.CreateFromConnectionString(的ConnectionString);
Console.WriteLine(NamespaceManager创建成功。); //创建测试队列
如果(!namespaceManager.QueueExists(QUEUENAME))
{
namespaceManager.CreateQueue(新QueueDescription(QUEUENAME)
{
RequiresDuplicateDetection =假,
RequiresSession =假,
LockDuration = TimeSpan.FromSeconds(60)
});
Console.WriteLine(队列创建成功。);
} //创建MessagingFactory对象
VAR messagingFactory = MessagingFactory.CreateFromConnectionString(的ConnectionString);
Console.WriteLine(MessagingFactory创建成功。); //创建messageSender,和对象
VAR messageSender,和=等待messagingFactory.CreateMessageSenderAsync(QUEUENAME);
Console.WriteLine(messageSender,和创建成功。); //创建消息负载
VAR testServiceBusMessage =新TestServiceBusMessage
{
ExternalIdentifier = Guid.NewGuid(),
标识符= 1,
NAME =巴布
}; //创建BrokeredMessage对象
使用(VAR brokeredMessage =新BrokeredMessage(testServiceBusMessage,
新的DataContractSerializer(typeof运算(TestServiceBusMessage)))
{
属性= {{消息类型的typeof(TestServiceBusMessage).FullName},
{的AssemblyName的typeof(TestServiceBusMessage).AssemblyQualifiedName}}
})
{
//发信息
messageSender.SendAsync(brokeredMessage).Wait();
}
Console.WriteLine(消息发送成功);
Console.WriteLine(preSS [Enter]键,退出);
到Console.ReadLine();
}
赶上(异常前)
{
Console.WriteLine(ex.Message);
Console.WriteLine(preSS [Enter]键,退出);
到Console.ReadLine();
}
}
#endregion
} [DataContract]
公共类TestServiceBusMessage
{
[数据成员]
公众的Guid ExternalIdentifier {搞定;组; } [数据成员]
公众诠释标识{搞定;组; } [数据成员]
公共字符串名称{;组; }
}
}
We have the below wrapper around the Azure Service Bus Client:
public virtual void SendMessage(object bodyObject)
{
var brokeredMessage =
_messageBodySerializer.SerializeMessageBody(bodyObject);
_queueClient.Send(brokeredMessage);
}
With the SerializeMessageBody
consisting of:
public BrokeredMessage SerializeMessageBody(object bodyObject)
{
var brokeredMessage = new BrokeredMessage(bodyObject);
brokeredMessage.Properties[MESSAGE_TYPE_PROPERTY_KEY] =
bodyObject.GetType().AssemblyQualifiedName;
return brokeredMessage;
}
I've written an integration test to check this works by running SendMessage
then viewing the message contents using Service Bus Explorer 2.0. We are doing this to ensure we can repair and resend messages using the tool to modify the XML. The message I am sending looks like this:
[DataContract]
public class TestServiceBusMessage
{
[DataMember]
public Guid ExternalIdentifier { get; set; }
[DataMember]
public int Identifier { get; set; }
[DataMember]
public string Name { get; set; }
}
The problem is; when the message body is viewed on the tool, instead of looking like XML it instead comes out like below:
@TestServiceBusMessageWhttp://schemas.datacontract.org/2004/07/IntegrationTests.Common.Azure.ServiceBus i)http://www.w3.org/2001/XMLSchema-instance@ExternalIdentifier?$13d81b90-d932-437f-a11c-9106412b6c4a@
Identifier?& @Name?Test Message
I assume this is an encoding issue; however I cannot see a way to set the encoding when passing the body into the BrokeredMessage
constructor; or defining it through a DataContract
attribute.
How would I get around this encoding issue? Would I need to provide my own serializer / stream or is there a way to force the default serializer to encode correctly?
try the following code. I tested it and I can see the payload in XML format using my tool (Service Bus Explorer: http://code.msdn.microsoft.com/windowsazure/Service-Bus-Explorer-f2abca5a#content). Basically, you need to explicitly specify the DataContractSerializer in the constructor of the BrokeredMessage object. Hope this helps. Ciao Paolo
#region MyRegion
using System;
using System.Runtime.Serialization;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;
#endregion
namespace StackOverflow
{
static class Program
{
#region Private Constants
private const string QueueName = "stackoverflow";
private const string MessageType = "MessageType";
private const string AssemblyName = "AssemblyName";
private const string ConnectionString = "<your-service-bus-namespace-connectionstring>";
#endregion
#region Static Methods
static void Main()
{
SendMessage();
}
static async void SendMessage()
{
try
{
// Create NamespaceManager object
var namespaceManager = NamespaceManager.CreateFromConnectionString(ConnectionString);
Console.WriteLine("NamespaceManager successfully created.");
// Create test queue
if (!namespaceManager.QueueExists(QueueName))
{
namespaceManager.CreateQueue(new QueueDescription(QueueName)
{
RequiresDuplicateDetection = false,
RequiresSession = false,
LockDuration = TimeSpan.FromSeconds(60)
});
Console.WriteLine("Queue successfully created.");
}
// Create MessagingFactory object
var messagingFactory = MessagingFactory.CreateFromConnectionString(ConnectionString);
Console.WriteLine("MessagingFactory successfully created.");
// Create MessageSender object
var messageSender = await messagingFactory.CreateMessageSenderAsync(QueueName);
Console.WriteLine("MessageSender successfully created.");
// Create message payload
var testServiceBusMessage = new TestServiceBusMessage
{
ExternalIdentifier = Guid.NewGuid(),
Identifier = 1,
Name = "Babo"
};
// Create BrokeredMessage object
using (var brokeredMessage = new BrokeredMessage(testServiceBusMessage,
new DataContractSerializer(typeof(TestServiceBusMessage)))
{
Properties = {{MessageType, typeof(TestServiceBusMessage).FullName},
{AssemblyName, typeof(TestServiceBusMessage).AssemblyQualifiedName}}
})
{
//Send message
messageSender.SendAsync(brokeredMessage).Wait();
}
Console.WriteLine("Message successfully sent.");
Console.WriteLine("Press [Enter] to exit");
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine("Press [Enter] to exit");
Console.ReadLine();
}
}
#endregion
}
[DataContract]
public class TestServiceBusMessage
{
[DataMember]
public Guid ExternalIdentifier { get; set; }
[DataMember]
public int Identifier { get; set; }
[DataMember]
public string Name { get; set; }
}
}
这篇关于在Azure的服务总线BrokeredMessage机构编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!