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.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>
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,您将得到一个异常,这同样适用于其他类型。
在 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.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>
Property or indexer 'string.this[int]' cannot be assigned to -- it is read only
试试 context.Request.Body.As
- 字节[]
- 字符串
- JToken
- JObject
- JArray
- XNode
- X元素
- X文档
请注意,如果您尝试在不包含有效 JSON 的响应上调用 .As