Azure 调度程序和 Azure 服务总线

Azure Scheduler and Azure Service Bus

我正在使用 Azure 调度程序将消息放入 Azure 服务总线的主题中。 在 Azure 调度程序中,我在 "Message" 属性:

中输入了以下信息
{"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 调度程序似乎正在向消息中添加信息。

仅检索我在 Azure 调度程序消息 属性 中输入的消息而不获取所有垃圾的正确方法是什么?

var messageData = Encoding.UTF8.GetString(message.Body);

根据您的代码,我假设您使用的是 Azure Service Bus .NET Standard Client SDK

@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 门户上服务总线操作的消息 属性 被视为设置字符串消息。如果您使用 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}");

测试:

Azure 服务总线 .NET 标准客户端仅处理流。 当使用旧客户端并且不使用流发送数据时,基于 Azure 服务总线 .NET 标准客户端的接收代码必须执行反序列化,如其他答案中所述。有一个 Broken Wire Compatability issue 已被包含详细信息的消息传递团队关闭。

好消息是您的代码库中不需要序列化程序代码。新客户端具有 Message 的互操作扩展方法,因此您不必处理数据协定反序列化。例如,在您的情况下,您可以编写

var message = await messageReceiver.ReceiveAsync();
var data = message.GetBody<string>();