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>();
我正在使用 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>();