Azure API Management重试策略条件失效及正确配置咨询
解决APIM Outbound重试策略先执行动作再检查条件的问题
嘿,我明白你遇到的困扰了——APIM的<retry>策略默认逻辑是先执行一次内部动作,再根据条件判断是否重试,哪怕你把条件设成@(false),内部的send-request还是会跑一次。这和你想要的「先检查条件,再决定是否执行(包括第一次)」的逻辑完全不符,下面给你两个可行的解决思路:
核心问题拆解
APIM重试策略的执行流程是固定的:
- 执行
<retry>块内的所有动作 - 检查
condition(或<retry-condition>)是否为真 - 如果为真,重复步骤1-2,直到达到
count次数
另外还要注意:你原来的重试条件是判断context.Response.StatusCode(这是原后端API的响应),但重试内部调用的是另一个外部API,所以重试条件应该基于这个外部API的响应状态,而不是原后端的响应,这一点之前的配置逻辑也有偏差。
解决方案1:用Choose策略包裹重试(推荐)
通过<choose>先判断初始条件(原后端响应非200),满足条件才进入重试流程,同时在重试内部检查外部API的响应来决定是否重试:
<outbound> <base /> <!-- 先判断是否需要触发外部API调用(包括第一次) --> <choose> <when condition="@(context.Response.StatusCode != 200)"> <retry count="2" interval="10" first-fast-retry="false"> <send-request mode="new" response-variable-name="responseVar" ignore-error="false"> <set-url>你的外部API地址</set-url> <set-method>POST</set-method> <set-body>你的请求体内容</set-body> <set-header name="你的头部键" exists-action="override"> <value>头部值</value> </set-header> </send-request> <!-- 基于外部API的响应状态判断是否重试 --> <set-variable name="needRetry" value="@(((IResponse)context.Variables["responseVar"]).StatusCode != 200)" /> <retry-condition>@((bool)context.Variables["needRetry"])</retry-condition> </retry> </when> </choose> </outbound>
解决方案2:调整重试策略的条件逻辑(如果不需要初始判断)
如果你只是想让重试的触发条件基于外部API的响应,而不需要提前判断原后端响应,可以直接把重试条件改成检查responseVar的状态,但要注意这时候send-request还是会执行一次:
<outbound> <base /> <retry count="2" interval="10" first-fast-retry="false"> <send-request mode="new" response-variable-name="responseVar" ignore-error="false"> <set-url>你的外部API地址</set-url> <set-method>POST</set-method> <set-body>你的请求体内容</set-body> <set-header name="你的头部键" exists-action="override"> <value>头部值</value> </set-header> </send-request> <!-- 直接用外部API的响应作为重试条件 --> <retry-condition>@(((IResponse)context.Variables["responseVar"]).StatusCode != 200)</retry-condition> </retry> </outbound>
但这个方案还是会执行一次send-request,只有重试次数受条件控制,所以如果需要完全跳过(当原后端响应是200时不调用外部API),还是方案1更贴合你的需求。
内容的提问来源于stack exchange,提问作者HowsTheJosh
相关产品推荐
相关产品推荐

