如何使用Azure API Manager缓存存储值策略存储JSON有效负载?

时间:2019-07-02 04:20:20

标签: azure-api-management

早安,

我正在尝试使用“缓存存储值”策略将传入的JSON有效负载存储到Azure API Manager内部缓存中。密钥将是有效载荷内部的字段之一。我能够提取密钥,但是当我尝试存储有效载荷时,出现错误

“表达式评估失败。对象引用未设置为对象的实例。”

这是我正在编写的代码

<policies>
<inbound>
    <base />
    <set-variable name="processIdKey" value="@((string)context.Request.Body.As<JObject>()["id"])" />
    <set-variable name="validationResults" value="@(context.Request.Body.As<JObject>())" />
    <cache-store-value key="@((string)context.Variables["processIdKey"])" value="@((string)context.Variables["validationResults"])" duration="30" />
</inbound>
<backend>
    <base />
</backend>
<outbound>
    <base />
</outbound>
<on-error>
    <base />
</on-error>

我后来需要在api的另一种方法中提取值,因此需要知道如何将JSON有效负载存储在缓存中,并提取相同的内容以作为在另一种方法中的响应进行发送。

预先感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

byte[]
string
JToken
JObject
JArray
XNode
XElement
XDocument

请注意,如果您尝试通过响应{strong>不包含有效JSON 来调用.As<JObject>,您将得到一个例外,同样适用于其他类型。

这里是article关于缓存的内容,您可以参考。

答案 1 :(得分:0)

我找到了答案,问题是,我们不能在整个代理中多次提取context.Request对象。因此,我要做的是将其存储在一个变量中,作为JObject,然后从中提取“ id”字段。稍后将其转换为字符串以存储在缓存中。这是更新的代码。

<policies>
<inbound>
    <base />
    <set-variable name="validationResults" value="@(context.Request.Body.As<JObject>())" />
    <set-variable name="processIdKey" value="@((string)((JObject)context.Variables["validationResults"])["id"])" />
    <set-variable name="payload" value="@((string)((JObject)context.Variables["validationResults"]).ToString())" />
    <cache-store-value key="@((string)context.Variables["processIdKey"])" value="@((string)context.Variables["payload"])" duration="30" />
</inbound>
<backend>
    <base />
</backend>
<outbound>
    <base />
</outbound>
<on-error>
    <base />
</on-error>

希望有帮助。谢谢。