Azure API 管理速率限制(按 Json 请求正文)

问题描述 投票:0回答:2
azure azure-api-management apim
2个回答
0
投票

我使用了以下格式的相同策略,它按预期工作了

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

enter image description here

enter image description here

Trace

enter image description here


0
投票

我想政策中有更多逻辑。

这个简单的策略不会产生上述错误:

<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>
© www.soinside.com 2019 - 2024. All rights reserved.