Проблема с кешем управления API Azure

Цель: использовать политику кеширования управления API для кеширования никогда не изменяющегося ответа json.

Исходный (без кеша)
Эта политика поддерживается лазурной функцией, которая возвращает неизменяемый ответ json.

<policies>
    <inbound>
        <base />
        <set-backend-service id="apim-generated-policy" backend-id="azfunc-fluffyoauth2" />
        <rewrite-uri template="/WellKnownOpenidConfiguration" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

Думая, что это может быть хорошо для кеширования, я ввел политику поиска в кеше.

<policies>
    <inbound>
        <base />
        <set-backend-service id="apim-generated-policy" backend-id="azfunc-fluffyoauth2" />
        <rewrite-uri template="/WellKnownOpenidConfiguration" />
        <cache-lookup vary-by-developer="false" vary-by-developer-groups="false" downstream-caching-type="none" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
        <cache-store duration="36000" />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

Я вижу, что кешированная версия возвращает двоичный файл, который, как мне кажется, сжат с помощью gzip. Это приводит к тому, что нижестоящий код, который ожидает, что это будет необработанный json, сломается. Этот ответ представляет собой документ об обнаружении соединений openid, и, по иронии судьбы, если я укажу на это в jwt-политике API Management, она тоже сломается.

i.e.

var auth0Domain = "https://apim-mycompany.azure-api.net/oauth2";
string responseString = null;
try
{
    var url = $"{auth0Domain}/.well-known/openid-configuration-cached";
    Console.WriteLine($"-------------------");
    Console.WriteLine($"{url}");
    var httpClient = new HttpClient();
    var response = await httpClient.GetAsync(new Uri($"{auth0Domain}/.well-known/openid-configuration-cached"));
    responseString = await response.Content.ReadAsStringAsync();
    Console.WriteLine($"-------------------");
    Console.WriteLine($"{responseString}");
    Console.WriteLine($"-------------------");
    JsonConvert.DeserializeObject<OpenIdConnectConfiguration>(responseString);
}
catch (Exception ex)
{
    Console.WriteLine($"Error:{ex.Message}");
    Console.WriteLine($"-------------------");
    return;
}



curl -I --location --request GET 'https://apim-fluffyoauth2.azure-api.net/oauth2/.well-known/openid-configuration-cached'
HTTP/1.1 200 OK
Cache-Control: no-store, must-revalidate, no-cache
Pragma: no-cache
Content-Length: 558
Content-Type: application/json; charset=utf-8
Content-Encoding: gzip
Expires: Tue, 14 Apr 2020 18:50:53 GMT
Vary: Accept-Encoding
Request-Context: appId=cid-v1:dfeba42c-e636-42bc-b501-7c77563c3e7b,appId=cid-v1:dfeba42c-e636-42bc-b501-7c77563c3e7b
Date: Tue, 14 Apr 2020 18:50:53 GMT

Вопросов):

Что делает политика кеширования?
Как я могу изменить ее, чтобы она по-прежнему кешировалась, но реагировала тем же, что и версия без кеширования?


person Herb Stahl    schedule 13.04.2020    source источник
comment
Ответ, сжатый сам по себе, не должен быть проблемой, если все заголовки содержимого находятся на своих местах. Не могли бы вы добавить образец кешированного ответа со всеми заголовками, которые вы получаете от APIM?   -  person Vitaliy Kurokhtin    schedule 14.04.2020
comment
APIM совершенно неожиданно не будет выполнять gzip, все, что мне нужно сделать, это изменить TTL политики кеширования и сохранить его. Это запускает отправку gzip. apim-fluffyoauth2.azure-api.net/oauth2 /.well-known/ HTTP / 1.1 200 OK Cache-Control: no-store, must-revalidate, no-cache Pragma: no-cache Content-Length: 558 Content-Type: application / json; charset = utf-8 Кодирование содержимого: gzip Срок действия: Вт, 14 апр 2020 г. 18:50:53 GMT Варьируется: Дата принятия кодирования: Вт, 14 апр 2020 г. 18:50:53 GMT   -  person Herb Stahl    schedule 14.04.2020
comment
APIM всегда отправляет все заголовки клиентов на бэкэнд, вы отправляли accept-encoding? Вы можете добавить в свою политику поиска в кеше переменную = accept-encoding, чтобы предотвратить ответ APIM с кэшированным содержимым, заархивированным с помощью gzip, если клиент этого не запрашивал.   -  person Vitaliy Kurokhtin    schedule 15.04.2020
comment
Я добавил ‹vary-by-header› Accept и Accept-Charset. Кажется, это исправило. Вы получаете то, о чем просите. ‹Поиск в кэше варьируется-от-разработчика = ложь-варьируется-от-разработчиков-групп = ложь тип-кеширования-нисходящего потока = нет› ‹vary-by-header› Принимать ‹/vary-by-header› ‹варьироваться по заголовку ›Accept-Charset ‹/vary-by-header› ‹/cache-lookup›   -  person Herb Stahl    schedule 15.04.2020


Ответы (1)


Добавление следующего:

<cache-lookup vary-by-developer="false" vary-by-developer-groups="false" downstream-caching-type="none">
  <vary-by-header>Accept</vary-by-header>
  <vary-by-header>Accept-Charset</vary-by-header>
</cache-lookup>

Что дает окончательную политику.

<policies>
<inbound>
    <base />
    <set-backend-service id="apim-generated-policy" backend-id="azfunc-fluffyoauth2" />
    <rewrite-uri template="/WellKnownOpenidConfiguration" />
    <cache-lookup vary-by-developer="false" vary-by-developer-groups="false" downstream-caching-type="none">
        <vary-by-header>Accept</vary-by-header>
        <vary-by-header>Accept-Charset</vary-by-header>
    </cache-lookup>
</inbound>
<backend>
    <base />
</backend>
<outbound>
    <base />
    <cache-store duration="3600" />
</outbound>
<on-error>
    <base />
</on-error>

Теперь управление API не выполняет кодировку gzip, когда об этом не просили.

Мне все еще интересно, почему Управление API внезапно прекратит кодирование gzip для исходной проблемы. Иногда он делал это, а затем останавливался, что приводило к некоторой путанице относительно того, что происходило.

person Herb Stahl    schedule 15.04.2020
comment
APIM не выполняет кодировку gzip. Запрос клиента, если он не изменен с помощью политик, полностью отправляется в серверную часть. Поэтому, если клиент не отправляет Accept-Encoding: gzip, APIM также не отправляет этот заголовок в бэкэнд, и бэкэнд не будет отвечать с gzip-содержимым. - person Vitaliy Kurokhtin; 16.04.2020
comment
Виталий, не могли бы вы связаться со мной, потому что это не то, что я вижу в поле. Я могу поделиться тем, что я делаю, и показать вам, как реагирует apim. - person Herb Stahl; 16.04.2020
comment
Я не модератор, поэтому не могу отправить вам в личку. И я не могу найти контактную информацию в вашем профиле. Вы можете добавить запрос, который вы отправляете в APIM, и ответ, который вы получаете от него, чтобы я мог посмотреть. - person Vitaliy Kurokhtin; 17.04.2020