Azure计划程序和Azure服务总线

时间:2018-02-11 18:30:34

标签: azureservicebus azure-scheduler

我正在使用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属性中输入的消息而没有获取所有垃圾的正确方法是什么?

2 个答案:

答案 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:

enter image description here

答案 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>();