API 管理无法将响应正文转换为字符串

Dav*_*ard 2 azure-api-management

在Azure API管理中,当返回客户端的响应是500时,我希望检查响应的正文以查看它是否与“某些文本”匹配。我需要这样做,以便我可以更改响应的正文以包含在此特定场景中一些更有用的文本。

API 管理控制台接受了我的策略的以下<outbound>部分,但是当我测试并得到 500 时,API 管理会生成错误 -

表达式求值失败。无法将“Microsoft.WindowsAzure.ApiManagement.Proxy.Gateway.MessageBody”类型的对象强制转换为“System.String”类型。

我猜这是我的错,但是有人知道我如何修改策略,使其不会产生错误吗?澄清一下,错误是由这一行 - 生成的((string)(object)context.Response.Body == "Some text")

<outbound>
    <choose>
        <when condition="@((context.Response.StatusCode == 500) && ((string)(object)context.Response.Body == "Some text"))">
            <set-status code="500" reason="Internal Server Error" />
            <set-header name="Content-Type" exists-action="override">
                <value>application/json</value>
            </set-header>
            <set-body>
                {
                    "statusCode": "500",
                    "Message": "Some different, more helpful text."
                }
            </set-body>
        </when>
    </choose>
</outbound>
Run Code Online (Sandbox Code Playgroud)

更新

我发现它context.Response.Body属于 类型IMessageBody。关于这种类型的文档似乎少得可怜,我能找到的唯一参考资料位于转换策略<set-body>API 管理文档中。

麻烦的是,当我尝试保存我的策略时,MS 记录的示例会产生异常 -

<set-body>
@{
    JObject inBody = context.Request.Body.As<JObject>();
    if (inBody.attribute == <tag>) {
        inBody[0] = 'm';
    }
    return inBody.ToString();
}
</set-body>
Run Code Online (Sandbox Code Playgroud)

无法分配属性或索引器“string.this[int]”——它是只读的

Vit*_*tin 5

尝试 context.Request.Body.As<string>()。方法 As 目前支持以下类型作为通用参数值:

  • 字节[]
  • 细绳
  • JToken
  • 对象
  • 数组
  • X节点
  • X元素
  • X文档

请注意,如果您尝试通过不包含有效 JSON 的响应调用 .As<JObject> ,您将收到异常,这同样适用于其他类型。