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

API Managment unable to cast response body as string

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

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

Expression evaluation failed. Unable to cast object of type 'Microsoft.WindowsAzure.ApiManagement.Proxy.Gateway.MessageBody' to type '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>

更新

我发现 context.Response.BodyIMessageBody 类型。关于这种类型的文档似乎少得可怜,我能找到的唯一参考文献是 Transformation Policies API 管理文档中的 <set-body>

问题是,MS havd 记录的示例在我尝试保存我的策略时产生异常 -

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

Property or indexer 'string.this[int]' cannot be assigned to -- it is read only

试试 context.Request.Body.As()。 Method As 当前支持以下类型作为通用参数值:

  • 字节[]
  • 字符串
  • JToken
  • JObject
  • JArray
  • XNode
  • X元素
  • X文档

请注意,如果您尝试在不包含有效 JSON 的响应上调用 .As,您将得到一个异常,这同样适用于其他类型。