【问题标题】:Azure API Management caching policyAzure API 管理缓存策略
【发布时间】:2020-06-11 04:25:08
【问题描述】:

在我的 Azure API 管理中,我在 API 级别定义了一个基于标头的缓存策略。 策略很简单:

<policies>
        <inbound>          
          <check-header name="token" failed-check-httpcode="400" failed-check-error-message="Token header is missing" ignore-case="true" />
          <cache-lookup vary-by-developer="false" vary-by-developer-groups="false" downstream-caching-type="none">
            <vary-by-header>token</vary-by-header>
          </cache-lookup>
          <base />
        </inbound>
        <backend>
          <forward-request />
        </backend>
        <outbound>
          <cache-store duration="3600" />
          <base />
        </outbound>
        <on-error>
          <base />
        </on-error>
    </policies>

如果我的下游返回带有正文的 200,这可以正常工作 - 具有相同标头令牌的下一个请求将命中缓存,并且响应将从 API 管理缓存返回。

但是,下游返回错误代码(例如:401 Unauthorized),表明 API 管理未缓存响应(由我在 API 管理上启用的跟踪确认)。 我的印象是整个响应都被缓存了,但情况似乎并非如此......

有人可以告诉我是否可以在 http 代码不成功的情况下缓存响应,如果可以,请指点我一些文档 - 我昨天整天都在谷歌搜索,但找不到更多信息。

提前致谢!

【问题讨论】:

    标签: azure caching azure-api-management


    【解决方案1】:

    这是设计使然。如果您查看跟踪信息,您应该会在此处看到消息“后端服务响应状态代码为 401 而不是 200 OK。缓存存储策略未应用。”原因是在 APIM 级别,我们假设非 200 响应比 200 更短暂。

    假设客户端收到 401,继续执行任何操作以确保允许令牌执行操作并重试调用。并且仍然从缓存中获取 401,直到缓存过期。

    这当然可以作为额外的配置选项添加到策略中:http://aka.ms/apimwish

    您可以通过使用缓存查找值和缓存存储值来解决此问题。 IE。在出站部分中,如果您获得 401,则使用缓存存储值将某些值存储在缓存中,以使用令牌作为键控。并且在缓存查找之前的入站中,使用令牌执行缓存查找值,看看您是否获得了较早存储的值。如果这样做,您可以立即生成 401 响应。

    【讨论】: