This is由消息在 ServiceBus 上的放置方式(特别是 C# 代码中的放置方式)引起。我使用以下代码添加新消息:
var json = JsonConvert.SerializeObject(item);
var message = new BrokeredMessage(json);
await TopicClient.SendAsync(message);
这段代码看起来不错,并且在不同的 C# 服务之间工作没有问题。问题是由以下方式引起的BrokeredMessage(Object)
构造函数序列化给它的有效负载:
使用带有二进制 XmlDictionaryWriter 的 DataContractSerializer 从给定对象初始化 BrokeredMessage 类的新实例。
这意味着内容被序列化为二进制 XML,这解释了前缀和无法识别的字符。反序列化时,C# 实现会隐藏这一点,并返回您期望的对象,但在使用不同的库(例如 Azure 逻辑应用程序使用的库)时,它会变得明显。
有两种方法可以解决此问题:
- 确保接收方可以处理二进制 XML 格式的消息
- 确保发件人实际上使用我们想要的格式,例如JSON。
Paco de la Cruz 的答案处理第一种情况,使用substring
, indexOf
and lastIndexOf
:
@json(substring(base64ToString(triggerBody()?['ContentData']), indexof(base64ToString(triggerBody()?['ContentData']), '{'), add(1, sub(lastindexof(base64ToString(triggerBody()?['ContentData']), '}'), indexof(base64ToString(triggerBody()?['ContentData']), '}')))))
对于第二种情况,从源头上解决问题只需使用BrokeredMessage(Stream)
构造函数代替。这样,我们就可以直接控制内容:
var json = JsonConvert.SerializeObject(item);
var bytes = Encoding.UTF8.GetBytes(json);
var stream = new MemoryStream(bytes);
var message = new BrokeredMessage(stream, true);
await TopicClient.SendAsync(message);