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

时间:2017-02-28 10:08:05

标签: azure-api-management

在Azure API Management中,当回复到客户端的响应是500时,我希望检查响应的正文以查看它是否匹配"某些文本"。我需要这样做,以便我可以在这个特定的场景中更改响应的主体以包含一些更有用的文本。

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

  

表达式评估失败。无法转换类型&#39; Microsoft.WindowsAzure.ApiManagement.Proxy.Gateway.MessageBody&#39;输入&#39; System.String&#39;。

我猜这是我的错,但是有人知道如何修改ploicy以便它不会产生错误吗?为了澄清,该行生成了错误 - ((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.Body的类型为IMessageBody。关于此类型的文档似乎很少,我可以找到的唯一参考文献位于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>
  

属性或索引器&#39; string.this [int]&#39;无法分配 - 它是只读的

1 个答案:

答案 0 :(得分:2)

尝试context.Request.Body.As&lt; string&gt;()。方法因为当前支持以下类型作为通用参数值:

  • 字节[]
  • 字符串
  • JToken
  • JObject
  • JArray
  • XNode
  • 的XElement
  • 的XDocument

请注意,如果你试图打电话.As&lt; JObject&gt;对于不包含有效JSON的响应,您将获得异常,同样适用于其他类型。