You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure APIM策略中后端响应状态码设置异常问题

修复Azure APIM策略中无法获取响应状态码的问题

问题原因

你当前使用<send-one-way-request mode="new">时,mode="new"会创建一个全新的独立请求上下文,这个上下文里的context.Response并不是后端返回的原响应,而是单向请求自身的响应(此时请求尚未发送,状态码为空或默认值),因此无法正确获取原响应的状态码。

修复方案

方案1:提前保存响应状态码到变量(推荐)

在进入send-one-way-request之前,先把原响应的状态码存入上下文变量,再在单向请求的set-body中引用该变量:

<policies>
    <inbound>
    </inbound>
    <backend>
        <forward-request />
    </backend>
    <outbound>
        <!-- 提前将原响应状态码存入变量 -->
        <set-variable name="originalResponseStatus" value="@(context.Response.StatusCode)" />
        
        <send-one-way-request mode="new" timeout="10000">
            <set-url>myURL</set-url>
            <set-method>POST</set-method>
            <set-body>@{ 
                var appIdNumber = Convert.ToInt32(context.Variables["appId"]);
                var apiId = context.Variables["apiId"];
                // 从变量中获取原响应状态码
                var statusCode = (int)context.Variables["originalResponseStatus"];
                
                JArray jarrayObj = new JArray();
                JObject obj = new JObject(
                    new JProperty("apiId", apiId),
                    new JProperty("appId", appIdNumber),
                    new JProperty("endpoint", context.Request.Url.Path + context.Request.Url.QueryString),
                    new JProperty("method", context.Request.Method),
                    new JProperty("status", statusCode),
                    new JProperty("apiLatency", context.Elapsed.Milliseconds),
                    new JProperty("timestamp", new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds()),
                    new JProperty("originIp", context.Request.IpAddress)
                );
                jarrayObj.Add(obj);
                return jarrayObj.ToString();
            }</set-body>
        </send-one-way-request>
    </outbound>
    <on-error />
</policies>

方案2:修改mode为copy

如果不需要隔离上下文,可以将send-one-way-request的mode改为copy,这样单向请求会复用当前上下文,此时context.Response.StatusCode就能直接获取原响应的状态码。但注意这种模式下,单向请求的操作可能会修改当前上下文的属性,需根据业务场景评估是否适用:

<send-one-way-request mode="copy" timeout="10000">
    <!-- 其余配置不变 -->
</send-one-way-request>

内容的提问来源于stack exchange,提问作者James De Luca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 21:08:31