Я работаю с кэшированием управления 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>
Кто-нибудь понял, как я могу удалить все эти ключи кеша?