如何在Azure服务总线上处理消息正文类型

如何在Azure服务总线上处理消息正文类型,azure,servicebus,Azure,Servicebus,在将azureRxMessage.GetBody类型从int更改为string后,我正在编写一些测试代码,结果出现错误azure“需要命名空间中的元素‘string’”http://schemas.microsoft.com/2003/10/Serialization/“…遇到名称为“int”的“Element”,命名空间为”http://schemas.microsoft.com/2003/10/Serialization/'. "} 当查看这一点时,总线似乎正在存储所有以前发送的项目,所以需

在将azureRxMessage.GetBody类型从int更改为string后,我正在编写一些测试代码,结果出现错误
azure“需要命名空间中的元素‘string’”http://schemas.microsoft.com/2003/10/Serialization/“…遇到名称为“int”的“Element”,命名空间为”http://schemas.microsoft.com/2003/10/Serialization/'. "}

当查看这一点时,总线似乎正在存储所有以前发送的项目,所以需要一个字符串,但正在读取一个int(正如以前发送的一样)。行
var msg=azureRxMessage.GetBody()引发了错误

我的问题是:

  • 处理消息的最佳方式是什么?将正文作为字符串(序列化为JSON)或标准数据协定发送

  • 如果客户机开始向总线发送格式不正确的消息并开始毒害总线,会发生什么情况?我们如何防范这种情况


  • 您可能需要能够部署对消息定义的更改,而不必先让队列干涸(或者让新类型的消息进入其他队列),因此在接收方使用类似于调度器的东西是一个不错的选择。您可以将消息类型的版本号放在可以指示消息版本号的上,然后使用该信息了解要反序列化正文的对象类型。或者,您可以首先将消息的内容提取为字符串,并在反序列化之前使用该字符串确定消息的版本。或者,您可以简单地将JSON主体加载反序列化为动态对象,并让代码查看它以确定如何处理它。所有这些方法都意味着,为了在代码中传入的不同类型的消息中生存下来,需要能够检测传递了哪种类型的允许正文,以便它能够相应地进行处理

    对于问题2,服务总线代理的消息传递确实内置了有害消息处理。如果在队列或订阅上设置了,则如果尝试传递的次数超过此次数,则消息将自动死信。您还可以更加主动,当您看到您不喜欢的消息体时,可以直接调用它。

    我的理论(不是基于对服务总线的太多经验,所以我将在这里仅作为注释)是,您应该将“应用程序数据”放在JSON字符串中,以便它可以随着应用程序的增长而轻松更改。更多地为有关消息的元数据而不是消息的内容使用true属性:
    SecurityID
    RequestorID
    DateSubmitted
    ExpirationDate
    ContainseCureData
    ,等等。这就是我们如何处理存储队列和表消息/行的方法,似乎同样适用于服务总线。也就是说,我不是这方面的专家,当然可能是错的!:-)