我正在使用Azure Scheduler在Azure Service Bus中的主题中放置消息。 在Azure Scheduler中,我在“消息”属性中输入了以下信息:
{"StartTid":null,"Id":"c594eab8-382c-49ec-ba9c-2db0aaf5e167","CreationDate":"2018-02-11T17:42:42.9823622Z","TenantId":null}
使用此代码从我的应用中检索邮件时:
var messageData = Encoding.UTF8.GetString(message.Body);
我收到的消息如下:
@string3http://schemas.microsoft.com/2003/10/Serialization/�{{"StartTid":null,"Id":"c594eab8-382c-49ec-ba9c-2db0aaf5e167","CreationDate":"2018-02-11T17:42:42.9823622Z","TenantId":null}
似乎Azure Scheduler正在向邮件添加信息。
只检索我在Azure Schedulers Message属性中输入的消息而没有获取所有垃圾的正确方法是什么?
答案 0 :(得分:0)
var messageData = Encoding.UTF8.GetString(message.Body);
根据您的代码,我假设您使用的是Azure Service Bus .NET Standard Client SDK。
@ string3http://schemas.microsoft.com/2003/10/Serialization/ {{" StartTid":空,"标识":" c594eab8-382c -49ec-ba9c-2db0aaf5e167"" CreationDate":" 2018-02-11T17:42:42.9823622Z"" TenantId":空}
根据我的测试,Azure Portal上的Service Bus操作的Message属性被视为设置字符串消息。如果您使用WindowsAzure.ServiceBus包,则可以使用以下代码检索邮件:
var messageData = message.GetBody<string>();
我认为Azure端使用该方法作为WindowsAzure.ServiceBus发送消息如下:
myTopicClient.Send(new BrokeredMessage("<the-value-of-the-Message-property-you-set>"));
对于您的问题,您可以使用WindowsAzure.ServiceBus使用该方法接收消息。我刚刚解组了WindowsAzure.ServiceBus库,您可以使用以下代码:
var mySerializer = new DataContractSerializer(typeof(string));
var obj = mySerializer.ReadObject(XmlDictionaryReader.CreateBinaryReader(new MemoryStream(message.Body), XmlDictionaryReaderQuotas.Max));
Console.WriteLine($"message received: {obj}");
<强> TEST:强>
答案 1 :(得分:0)
Azure Service Bus .NET标准客户端仅处理流。 使用旧客户端并且不使用流发送数据时,基于Azure Service Bus .NET标准客户端的接收代码必须执行反序列化,如其他答案中所述。消息团队关闭了Broken Wire Compatability issue,其中包含详细信息。
好消息是您不需要代码库中的序列化程序代码。新客户端具有Message
的互操作扩展方法,因此您不必处理数据协定反序列化。例如,在您的情况下,您可以编写
var message = await messageReceiver.ReceiveAsync();
var data = message.GetBody<string>();