-1

我正在使用 Azure 调度程序将消息放置在 Azure 服务总线中的主题中。在 Azure 调度程序中,我在“消息”属性中输入了以下信息:

{"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 属性中输入的消息而不获取所有垃圾的正确方法?

4

2 回答 2

0

Azure 服务总线 .NET 标准客户端仅处理流。当使用旧客户端并且不使用流发送数据时,基于 Azure 服务总线 .NET 标准客户端的接收代码必须执行反序列化,如另一个答案中所述。具有详细信息的消息传递团队已关闭了断线兼容性问题。

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

var message = await messageReceiver.ReceiveAsync();
var data = message.GetBody<string>();
于 2018-02-12T23:20:02.833 回答
0

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 门户上的 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}");

测试:

在此处输入图像描述

于 2018-02-12T08:19:32.687 回答