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

Azure APIM中on-error阶段构造返回JSON响应失败求助

解决Azure API Management 阶段返回自定义JSON错误响应的问题

针对你遇到的问题,原策略存在几个关键问题导致JSON响应构造失败,以下是修正后的完整策略及说明:

核心问题分析

  1. on-error阶段的<base />会触发默认错误处理逻辑,可能覆盖你的自定义响应
  2. set-body内的C#代码存在语法错误:变量声明末尾缺少分号
  3. JSON字符串转义格式错误,且未处理context.LastError为null的情况

修正后的策略代码

<policies>
    <inbound>
        <base />
        <!-- Prep the request -->
        <set-variable name="forceError" value="@{
            throw new Exception("Forced APIM policy error for testing");
        }" />
        <!-- Validate required parameters -->
        <include-fragment fragment-id="auth0-get-user-validate-userid" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <!-- 移除base,避免默认错误逻辑覆盖自定义响应 -->
        <set-variable name="apimErrorContextMessage" value="@(
            $"APIM error in API '{context.Api.Name}', operation '{context.Operation.Name}', method '{context.Request.Method}'"
        )" />
        <trace source="Auth0 Api - ErrorHandler" severity="error">
            <message>@(Convert.ToString(context.Variables["apimErrorContextMessage"]))</message>
        </trace>
        <return-response>
            <set-status code="500" />
            <set-header name="Content-Type" exists-action="override">
                <value>application/json</value>
            </set-header>
            <set-body>@{
                var contextMsg = Convert.ToString(context.Variables["apimErrorContextMessage"]);
                var errorDetails = context.LastError?.Message ?? "No error details available";
                return $@"{{
                    ""status"": 500,
                    ""message"": ""{contextMsg}"",
                    ""details"": ""{errorDetails.Replace("\"", "\\\"")}""
                }}";
            }</set-body>
        </return-response>
    </on-error>
</policies>

关键改动说明

  • 移除on-error内的<base />:避免APIM默认错误响应逻辑干扰自定义输出
  • 修复C#语法错误:给变量声明添加分号,确保代码编译通过
  • 处理空值情况:用??运算符给context.LastError?.Message设置默认值,防止空引用
  • 转义特殊字符:对错误详情里的双引号进行转义,保证JSON格式合法
  • 优化JSON格式:统一缩进,让输出的JSON结构更清晰

更可靠的替代方案(使用JObject构造)

如果字符串拼接容易出错,推荐直接用Newtonsoft.Json.Linq.JObject构造JSON,避免手动转义问题:

<set-body>@{
    var contextMsg = Convert.ToString(context.Variables["apimErrorContextMessage"]);
    var errorDetails = context.LastError?.Message ?? "No error details available";
    return new Newtonsoft.Json.Linq.JObject(
        new Newtonsoft.Json.Linq.JProperty("status", 500),
        new Newtonsoft.Json.Linq.JProperty("message", contextMsg),
        new Newtonsoft.Json.Linq.JProperty("details", errorDetails)
    ).ToString();
}</set-body>

这种方式由APIM自动处理JSON格式,无需手动转义特殊字符,稳定性更强。

内容的提问来源于stack exchange,提问作者Tech with Thiru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 15:05:04