早安,
我正在尝试使用“缓存存储值”策略将传入的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有效负载存储在缓存中,并提取相同的内容以作为在另一种方法中的响应进行发送。
预先感谢您的帮助。
答案 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>
希望有帮助。谢谢。