Управление API Azure, удаление нескольких значений кэша - PullRequest
0 голосов
/ 23 июня 2019

Я работаю с кэшированием управления API (APIM) Azure и застрял при удалении значений кэша. Кеширование по умолчанию с cache-store и cache-lookup работало нормально, но нам пришлось разрешить изменение поля имени через наш API, что привело к тому, что кешированный ответ возвращал неверное значение.

Так, например, конечный пользователь выбирает данные на GET / person , обновляет имя на POST / person / 1 с Джеффа до Дейва, но когда он выбирает людей снова Дэйва все еще зовут Джефф.

Насколько я понял, не было никакого способа удалить значение кэша таким способом, только чтобы указать продолжительность, поэтому политику пришлось переписать с использованием cache-lookup-value и cache-store-value операторы, которые позволяют использовать cache-remove-value . Таким образом, я определил, что значения кэша состоят из ключа подписки + субъекта jwt + конечная точка + параметры запроса, который, в конце концов, выглядит следующим образом: SUBSCRITION_KEY / JWT_SUBJECT / человек? Name = Jeff

Таким образом, у меня был контроль над ключом кеша, и кеширование в основном работало так же, как с cache-store и cache-lookup

Теперь, часть, с которой я застрял - пользователь может выполнить несколько различных запросов для / person, например:

 GET /person  
 GET /person?Name=Jeff  
 GET /person?MinAge=30  
 GET /person?MaxAge=60&City=NY

но если пользователь делает POST / person (изменяет какие-либо данные), я хочу сбросить все значения кэша для конечной точки / person, но только для этого пользователя.

Проблема в том, что когда пользователь делает POST / person, я не уверен, какие ключи мне нужно сбросить, поэтому я также сохраняю посещенные конечные точки GET / person в SUBSCRITION_KEY / JWT_SUBJECT ключ кэширования и сериализация словаря , где строка - это конечная точка + строка запроса, а datetime - время, когда конечная точка была посещена.

Если бы я мог как-то десериализовать словарь и просмотреть значения, я мог бы удалить их все, но не уверен, возможно ли это вообще

<outbound>
    <cache-lookup-value key="@("SUBSCRITION_KEY/JWT_SUBJECT" variable-name="cachevalue" />
    <base />
     <choose>
        <when condition="@(context.Variables.ContainsKey("cachevalue") && !string.isNullOrWhiteSpace(context.Variables["cachevalue"]))">
        // Deserialize the context.Variables["cachevalue"] to Dictionart<string, DateTime>
        // Do a cache-remove-value for every item
        </when>
    </choose>
</outbound>

или, возможно, использовать подстановочный знак

<outbound>
    <base />
    <cache-remove-value key="SUBSCRITION_KEY/JWT_SUBJECT/person*" />
</outbound>

Кто-нибудь понял, как я могу удалить все эти ключи кеша?

...