Azure APIM 如何携带相同请求体将请求转发至两个不同后端
Azure APIM 同请求转发双后端配置方案
问题根因
原配置无法正常运行的核心原因有3个:
- 类型不匹配:存储请求体时将内容解析为
JObject类型存入变量,读取时却指定按string类型取值,策略引擎校验不通过 - 标签语法错误:
set-body节点多写了一层闭合标签,不符合XML语法规范 - 读取逻辑冗余:不需要先把请求体存成JObject再转字符串,直接读取原始字符串内容兼容性更好,还能避免JSON序列化转义问题
修正后可用策略配置
直接替换原有策略即可,配置逻辑为:先缓存原始JSON请求体,主请求正常转发到主后端,同时并行发POST请求到副后端,全程保留原始请求体内容不丢失:
<policies> <inbound> <base /> <!-- 缓存原始请求体,preserveContent设为true保证主后端能正常拿到请求内容 --> <set-variable name="bodyREQ" value="@(context.Request.Body.As<string>(preserveContent: true))" /> <set-query-parameter name="code" exists-action="override"> <value>{{FAcode}}</value> </set-query-parameter> <rewrite-uri template="/main" /> <set-backend-service base-url="https://mymainbackend.azurewebsites.net" /> <!-- 并行转发到副后端,可通过response-variable-name存储副后端响应供后续聚合使用 --> <send-request mode="new" response-variable-name="secondaryBackendResp"> <set-url>https://mysecondaryurl.azurewebsites.net</set-url> <set-method>POST</set-method> <set-header name="content-type" exists-action="override"> <value>application/json</value> </set-header> <!-- 直接传入缓存的原始请求体字符串 --> <set-body>@(context.Variables.GetValueOrDefault<string>("bodyREQ"))</set-body> </send-request> </inbound> <backend> <base /> </backend> <outbound> <base /> <!-- 如需聚合两个后端的响应,可在此处通过context.Variables["secondaryBackendResp"]拿到副后端返回内容做合并处理 --> </outbound> <on-error> <base /> </on-error> </policies>
额外配置说明
- 若副后端需要和主后端携带完全一致的请求头、查询参数,可在
send-request节点内补充对应配置项,不需要额外重新解析请求 - 该配置默认会在inbound阶段并行发起副后端请求,不会阻塞主后端的请求转发流程,若不需要等待副后端返回结果再给客户端响应,无需额外调整
- 若请求体不是JSON格式(比如form表单、二进制流),只需要把
content-type头改成对应值即可,请求体缓存逻辑不需要调整
内容的提问来源于stack exchange,提问作者da_Azure_developer
相关产品推荐
相关产品推荐

