我可以通过响应内容限制 Azure API 管理缓存存储吗?
Can I restrict Azure API Management cache storage by response content?
我有一个 OLTP API,客户端可以在其中检查事务的状态。
通常,客户会为处于最终状态的交易发出多个状态请求,例如取消。我想利用 Azure API 管理响应缓存,但 仅 用于事务状态为最终的响应。
API 响应正文消息只是 URL 编码,例如reference=ABC123&status=Cancelled&amount=123.45
所以确定交易状态是否为最终状态应该很简单
更新
感谢@MohamadHaidar 的回答,我能够构建一个策略来实现缓存,但是响应正文现在是空白的!我怀疑这是因为它被条件读取并且只能读取一次?
<policies>
<inbound>
<base />
<cache-lookup vary-by-developer="false" vary-by-developer-groups="false" downstream-caching-type="none" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
<choose>
<when condition="@(Regex.IsMatch(context.Response.Body.As<string>(), @"status=(Cancelled|Paid)"))">
<cache-store duration="3600" />
</when>
</choose>
</outbound>
<on-error>
<base />
</on-error>
</policies>
您可以使用控制流策略有条件地缓存值
https://docs.microsoft.com/en-us/azure/api-management/api-management-advanced-policies#choose
您需要做的就是将缓存存储放在 choose/When 策略中
https://docs.microsoft.com/en-us/azure/api-management/api-management-caching-policies#policy-statement-1
解决方案
感谢 ,我能够构建我在下面分享的解决方案。
注意:阅读request/response正文时需要设置preserveContent: true
(除非你在阅读完正文后要设置自己的正文现有的)否则它将不再在管道中可用。更多相关信息 here
所以,最终的解决方案如下:
<policies>
<inbound>
<base />
<cache-lookup vary-by-developer="false" vary-by-developer-groups="false" downstream-caching-type="none" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
<choose>
<when condition="@(Regex.IsMatch(context.Response.Body.As<string>(preserveContent: true), @"status=(Cancelled|Paid)"))">
<cache-store duration="3600" />
</when>
</choose>
</outbound>
<on-error>
<base />
</on-error>
</policies>
我有一个 OLTP API,客户端可以在其中检查事务的状态。
通常,客户会为处于最终状态的交易发出多个状态请求,例如取消。我想利用 Azure API 管理响应缓存,但 仅 用于事务状态为最终的响应。
API 响应正文消息只是 URL 编码,例如reference=ABC123&status=Cancelled&amount=123.45
所以确定交易状态是否为最终状态应该很简单
更新
感谢@MohamadHaidar 的回答,我能够构建一个策略来实现缓存,但是响应正文现在是空白的!我怀疑这是因为它被条件读取并且只能读取一次?
<policies>
<inbound>
<base />
<cache-lookup vary-by-developer="false" vary-by-developer-groups="false" downstream-caching-type="none" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
<choose>
<when condition="@(Regex.IsMatch(context.Response.Body.As<string>(), @"status=(Cancelled|Paid)"))">
<cache-store duration="3600" />
</when>
</choose>
</outbound>
<on-error>
<base />
</on-error>
</policies>
您可以使用控制流策略有条件地缓存值 https://docs.microsoft.com/en-us/azure/api-management/api-management-advanced-policies#choose
您需要做的就是将缓存存储放在 choose/When 策略中 https://docs.microsoft.com/en-us/azure/api-management/api-management-caching-policies#policy-statement-1
解决方案
感谢
注意:阅读request/response正文时需要设置preserveContent: true
(除非你在阅读完正文后要设置自己的正文现有的)否则它将不再在管道中可用。更多相关信息 here
所以,最终的解决方案如下:
<policies>
<inbound>
<base />
<cache-lookup vary-by-developer="false" vary-by-developer-groups="false" downstream-caching-type="none" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
<choose>
<when condition="@(Regex.IsMatch(context.Response.Body.As<string>(preserveContent: true), @"status=(Cancelled|Paid)"))">
<cache-store duration="3600" />
</when>
</choose>
</outbound>
<on-error>
<base />
</on-error>
</policies>