Azure API Management能否基于请求负载中的指定键实现缓存?
Azure API Management 基于请求负载字段配置缓存方案
完全支持你描述的场景。你可以通过APIM的自定义策略解析JSON/XML格式的请求负载,提取指定的CustomerId字段,将其纳入缓存键的生成规则,实现按用户维度的缓存控制。
核心实现逻辑
APIM默认的缓存键仅包含请求方法、请求URL等基础信息,要加入请求体中的自定义字段,需要做如下配置:
- 入站阶段先开启请求体缓冲,确保请求体被策略读取后仍能正常转发给后端服务
- 通过策略表达式解析请求体,提取CustomerId字段存入自定义变量
- 配置缓存查找规则时,将自定义变量作为缓存键的可变参数
示例策略
JSON请求负载配置
<policies> <inbound> <base /> <!-- 保留请求体内容,避免读取后后端无法获取 --> <set-body template="none">@(context.Request.Body.As<string>(preserveContent: true))</set-body> <!-- 提取JSON中CustomerId字段,可根据你的实际JSON结构调整 --> <set-variable name="customerId" value="@(context.Request.Body.As<JObject>()["CustomerId"].ToString())" /> <!-- 缓存查找规则,加入CustomerId作为缓存区分维度 --> <cache-lookup vary-by-developer="false" vary-by-developer-groups="false"> <vary-by-header>Content-Type</vary-by-header> <vary-by-custom>@((string)context.Variables["customerId"])</vary-by-custom> </cache-lookup> </inbound> <backend> <base /> </backend> <outbound> <base /> <!-- 缓存存储,时长单位为秒,可按需调整 --> <cache-store duration="1800" /> </outbound> <on-error> <base /> </on-error> </policies>
XML请求负载配置
如果请求是XML格式,只需修改提取CustomerId的变量配置即可,示例如下:
<!-- 假设XML根节点为Request,CustomerId为其子节点,可根据实际结构调整 --> <set-variable name="customerId" value="@(context.Request.Body.As<XElement>().Element("Request").Element("CustomerId").Value)" />
注意事项
- 建议增加字段存在性判断逻辑,避免请求体中无CustomerId时策略执行报错
- 大体积请求负载的解析操作会产生少量性能开销,高并发场景下建议提前做压测评估
- 如果你的API同时支持JSON和XML格式,可以在策略中增加Content-Type判断,适配不同的解析逻辑
内容的提问来源于stack exchange,提问作者user1005448
相关产品推荐
相关产品推荐

