Azure APIM中使用rewrite-uri追加上下文变量的方法咨询
解决Azure APIM中上下文变量追加到URL的重写问题
你遇到的问题核心在于上下文变量的引用方式和策略执行顺序,咱们一步步来搞定:
错误原因分析
你原来写的<rewrite-uri template="/accounts/{accountKey}" />里的{accountKey},APIM会默认把它当成请求的路径/查询参数去匹配,而不是你存在context.Variables里的上下文变量,所以才会抛出“Variable accountKey has no value.”的错误。另外还要注意:如果你的set-variable策略是在rewrite-uri之后执行的,那执行重写时变量还没被赋值,也会触发同样的问题。
正确实现方法
1. 用策略表达式引用上下文变量
在APIM策略中,要调用context.Variables里的变量,必须用**@{...}包裹的策略表达式**语法。把rewrite-uri的模板改成这样:
<rewrite-uri template="/accounts/@{context.Variables["accountKey"]}" />
APIM在执行时会自动解析这个表达式,把context.Variables["accountKey"]的实际值替换进去。
2. 确保变量在重写前完成赋值
检查你的策略执行顺序,set-variable必须放在rewrite-uri之前执行,这样当重写URL操作触发时,变量已经有有效值了。完整的inbound策略示例如下:
<policies> <inbound> <!-- 先执行变量设置,保证顺序在重写之前 --> <set-variable name="accountKey" value="232" /> <base /> <rewrite-uri template="/accounts/@{context.Variables["accountKey"]}" /> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies>
验证结果
按照这个配置执行后,APIM会成功把请求URL重写为/accounts/232,完全符合你的目标要求。
内容的提问来源于stack exchange,提问作者ΩmegaMan
相关产品推荐
相关产品推荐

