3

在将 azureRxMessage.GetBody 类型从 int 更改为 string 后,我正在编写一些测试代码,但出现错误azure "Expecting element 'string' from namespace 'http://schemas.microsoft.com/2003/10/Serialization/'.. Encountered 'Element' with name 'int', namespace 'http://schemas.microsoft.com/2003/10/Serialization/'. "}

在查看此内容时,似乎总线正在存储所有先前发送的项目,因此期待一个字符串,但正在读取一个 int(如之前发送的那样)。该行var msg = azureRxMessage.GetBody<string>();引发了错误。

我的问题是:

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

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

4

1 回答 1

3

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

对于问题二,Service Bus Brokered 消息传递确实具有内置的有害消息处理功能。如果您在 Queue 或 Subscription 上设置MaxDeliveryCount 属性,如果尝试传递的消息超过此次数,它将自动死信。您还可以更加主动,当您看到不喜欢的消息正文时,可以直接调用Deadletter

于 2013-04-07T13:23:28.347 回答