Как сохранить полезную нагрузку JSON с помощью политики значений хранилища кеша Azure API Manager? - PullRequest
0 голосов
/ 02 июля 2019

Добрый день,

Я пытаюсь сохранить входящие данные JSON во внутреннем кеше Azure API Manager с помощью политики «cache-store-value». Ключ будет одним из полей, входящих в полезную нагрузку. Я могу извлечь ключ, но когда я пытаюсь сохранить данные, я получаю сообщение об ошибке

"Ошибка оценки выражения. Ссылка на объект не установлена ​​для экземпляра объекта."

Вот код, который я пишу

<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 голосов
/ 04 июля 2019

Я нашел ответ, проблема была в том, что мы не можем извлечь объект 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>

Надеюсь, это поможет.Спасибо.

0 голосов
/ 03 июля 2019

Попробуйте context.Request.Body.As<string>(). Метод As в настоящее время поддерживает следующие типы в качестве значения общего аргумента:

byte[]
string
JToken
JObject
JArray
XNode
XElement
XDocument

Помните, что если вы попытаетесь вызвать .As<JObject> через ответ, что не содержит действительный JSON , вы получите исключение, то же самое относится и к другим типам.

Вот статья о кэшировании, на которую вы могли бы сослаться.

...