我可以通过响应内容限制 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>