【发布时间】:2019-07-02 04:20:20
【问题描述】:
美好的一天,
我正在尝试使用“缓存存储值”策略将传入的 JSON 有效负载存储到 Azure API 管理器内部缓存中。密钥将是有效载荷内的字段之一。我能够提取密钥,但是当我尝试存储有效负载时出现错误
“表达式评估失败。对象引用未设置为对象的实例。”
这是我正在编写的代码
<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 有效负载存储在缓存中并提取相同的值以在另一种方法中作为响应发送。
提前感谢您的帮助。
【问题讨论】:
-
从 Azure 门户进行测试调用并检查跟踪以查看哪个表达式准确产生了空引用。在不知道您请求的详细信息的情况下,我会说您需要检查 Body 是否为空(它用于 GET/HEAD 请求)。
-
问候 Vitaliy,对不起,我应该把跟踪错误。我在以下语句中遇到错误
现在我找到了解决方案。原因是上下文变量 Request 不能被多次引用。所以我必须将它存储在一个变量中,然后将其转换为字符串。 -
啊。其背后的原因是 APIM 默认不缓存请求体。当您在策略 (.As
()) 中读取它时,正文被消耗并替换为 null 以不将其存储在内存中两次(一次作为解析的 JObject,第二次作为流)。如果您总是需要它作为 JObject 将它放入变量中是正确的方法。但是,如果您需要对其进行两次解析,您可以通过调用 .As (preserveContent: true) 来实现。这样的调用仍然会为您提供 JObject,但也会缓存原始主体以供进一步使用。 -
问候 Vitaliy,太好了,解释真的很有帮助。你是* :-)
-
我希望在文档中明确说明对尸体的处置!感谢您的提问和回答!