Azure API管理缓存策略

时间:2020-02-27 07:44:41

标签: azure caching azure-api-management

在我的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 Management缓存(由我在API Management上启用的跟踪确认)。 我给人的印象是整个响应都被缓存了,但是事实并非如此……

有人可以让我知道在http代码不成功的情况下是否也可以缓存响应,如果可以,请指向我一些文档-我昨天整天一直在搜索,但是找不到更多信息。

谢谢!

1 个答案:

答案 0 :(得分:0)

这是设计使然。如果您查看跟踪,则应该看到消息“后端服务以状态码401(而不是200 OK)响应。未应用缓存存储策略”。原因是在APIM级别上,我们假设非200个响应比200个更瞬变。

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

当然可以将其作为策略的附加配置选项添加:http://aka.ms/apimwish

您可以通过使用cache-lookup-value和cache-store-value解决此问题。即在出站部分中,如果您获得401,则使用cache-store-value在令牌中键入一些值,以将其存储在缓存中。并在入站之前执行cache-lookup并使用token进行cache-lookup-value,看看是否早先存储了值。如果您这样做,则可以立即生成401响应。