我使用了以下格式的相同策略,它按预期工作了
Policy
<policies>
<inbound>
<base />
<rate-limit-by-key calls="5" renewal-period="10" counter-key="@(context.Request.Body.As<JObject>()["mailTo"].ToString())" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
Test Result
Trace
我想政策中有更多逻辑。
这个简单的策略不会产生上述错误:
<policies>
<inbound>
<base />
<rate-limit-by-key calls="5" renewal-period="10" counter-key="@(context.Request.Body.As<JObject>()["mailTo"].ToString())" />
<return-response>
<set-status code="200" reason="Ok" />
<set-body>{
"message": "It's fine!"
}</set-body>
</return-response>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
但我猜想请求正文在策略中至少使用了两次。 因此,您必须将参数
preserveContent
设置为 true
:
context.Request.Body.As<JObject>(true)["mailTo"].ToString()
https://learn.microsoft.com/en-us/azure/api-management/api-management-policy-expressions
为了避免这种情况并让该方法对主体流的副本进行操作,请将preserveContent参数设置为true
两次使用请求的策略:
<policies>
<inbound>
<base />
<rate-limit-by-key calls="5" renewal-period="10" counter-key="@(context.Request.Body.As<JObject>(true)["mailTo"].ToString())" />
<set-variable name="email" value="@(context.Request.Body.As<JObject>(true)["mailTo"]?.ToString().ToLower())" />
<return-response>
<set-body template="none">@{
var jsonResponse = new JObject();
jsonResponse.Add(new JProperty("message", (string)context.Variables["email"]));
return jsonResponse.ToString();
}</set-body>
</return-response>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>