Azure APIM set-body策略返回Byte数据致JSON解析失败排查
问题分析与解决方案
错误根源
报错里的0x0A是换行符,说明构造的请求体JSON中存在未转义的换行字符,导致后端System.Text.Json无法正确解析为FooBarModel。同时你的APIM策略存在语法和结构错误,进一步引发了这个问题。
策略修正要点
- 移除Liquid模板冲突:原策略中
set-body同时混用template="liquid"和C#代码,两种方式不能共存,改用纯C#代码块生成请求体。 - 修复JSON构造语法:原C#代码里的匿名对象初始化存在语法错误(嵌套结构缺少键名),改用
JObject+JProperty的方式构建合法的JSON结构。 - 强制JSON转义:使用
JObject.ToString(Formatting.None)序列化,确保所有特殊字符(如换行、引号)被正确转义,避免后端解析报错。 - 修正策略嵌套结构:原策略中
set-header被嵌套在set-body内部,不符合APIM策略的XML结构规范,需改为独立的策略节点。
修正后的完整策略
<policies> <inbound> <base /> <choose> <when condition="@(context.Request.Headers.GetValueOrDefault("Authorization","").AsJwt()?.Claims.GetValueOrDefault("key", "") == "AuthTokenValue")"> <set-backend-service backend-id="BackendId" /> <set-body>@{ JObject body = context.Request.Body.As<JObject>(); var newBody = new JObject( new JProperty("key1", body["key1"]), new JProperty("key2", body["key2"]), new JProperty("nestedKey", new JObject( new JProperty("key3", body["key3"]), new JProperty("key4", body["key4"]) )) ); return newBody.ToString(Newtonsoft.Json.Formatting.None); }</set-body> <set-header name="Content-Type" exists-action="override"> <value>application/json</value> </set-header> <rewrite-uri template="/api/v1/end/{value}/point" /> </when> <otherwise /> </choose> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies>
额外排查建议
- 验证原始请求体:通过APIM测试控制台或日志,检查传入的原始请求体是否本身包含未转义的特殊字符。
- 匹配DTO结构:确保新构造的JSON字段名、嵌套结构与后端
FooBarModel完全一致,避免因结构不匹配导致解析失败。
内容的提问来源于stack exchange,提问作者Felipe Vallim
相关产品推荐
相关产品推荐

