在我的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代码不成功的情况下是否也可以缓存响应,如果可以,请指向我一些文档-我昨天整天一直在搜索,但是找不到更多信息。
谢谢!
答案 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响应。