Azure Logic App读取Service Bus消息带序列化前缀无法解析JSON
问题根因
消息头部的@string3http://schemas.microsoft.com/2003/10/Serialization/前缀是WCF NetDataContractSerializer做二进制字符串序列化时自动生成的类型标识头,和你发送的JSON内容本身无关。
问题核心原因是Azure DevOps内置的PublishToAzureServiceBus任务默认使用WCF二进制序列化规则封装消息,和Azure DevOps Webhook直接推送纯JSON的格式不统一,Logic App读取消息时直接将原始字节转为字符串,就会把这段序列化头一并带出,最终导致JSON解析失败。
解决方案
按优先级从高到低选择即可:
方案1:统一发送侧消息格式(最优解,一劳永逸)
- 弃用内置的
PublishToAzureServiceBus任务发送JSON,改用Azure CLI任务或者HTTP任务调用Service Bus原生REST API发消息,发送时明确指定Content-Type为application/json,直接传递原始JSON字符串,完全绕开WCF序列化逻辑。 - 如果必须使用内置
PublishToAzureServiceBus任务,检查任务配置项,开启「发送原始消息」开关(高版本任务支持该参数),关闭默认的序列化封装。 - Azure DevOps Webhook本身发送的就是无封装的纯JSON,不需要调整配置。
方案2:Logic App侧做内容清洗(临时快速修复)
如果暂时改不了发送侧配置,直接在Logic App里加一步字符串处理,剥离前缀后再解析JSON:
- 从Service Bus触发器拿到消息内容后,先定位第一个
{字符的位置 - 截取从该位置到字符串末尾的部分,就是合法的纯JSON内容
- 对截取后的内容执行JSON解析即可
可以直接用Logic App内置表达式一步完成处理:
json(substring(triggerOutputs()?['body']['ContentData'], indexOf(triggerOutputs()?['body']['ContentData'], '{')))
注意:如果你的消息体在JSON主体前可能出现
{字符,这个截取逻辑会出错,优先选择发送侧改造的方案。
方案3:Service Bus队列配置转换规则
可以给Service Bus队列配置消息入站转换规则,自动识别剥离WCF序列化头,不过该方案配置复杂度高,非特殊场景不推荐使用。
验证方法
修改配置后用Service Bus的peek功能查看入队消息,如果消息开头直接是{,没有额外前缀,就说明配置生效,后续JSON解析不会再报错。
内容的提问来源于stack exchange,提问作者Baharul
相关产品推荐
相关产品推荐

