Azure APIM按密钥速率限制的意外行为

6ojccjat  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(78)

我有一个问题与利率限制的关键,repsonse是不符合预期。
使用此策略片段时:

<rate-limit-by-key calls="1" renewal-period="2" counter-key="@(context.Request.IpAddress)" increment-condition="@(context.Response.StatusCode == 200)" />

字符串
当达到限制时,它有时会给出“500内部服务器错误”,有时会给出“401未经授权”的响应。
当我使用这个:

<set-variable name="CounterKey" value="context.Request.IpAddress" />
<rate-limit-by-key calls="1" renewal-period="2" counter-key="@(context.Variables.GetValueOrDefault<string>("CounterKey"))" increment-condition="@(context.Response.StatusCode == 200)" />


我得到了预期的“429太多的请求”响应代码时达到限制。
还尝试了IpAddress的.Tostring。

<rate-limit-by-key calls="1" renewal-period="2" counter-key="@(context.Request.IpAddress.ToString())" increment-condition="@(context.Response.StatusCode == 200)" />


还是500和401的回复
set-varaiable和rate-limit-by-key在完全相同的上下文/范围内,所以不明白为什么它给出不同的响应。
有什么想法吗

r1zhe5dt

r1zhe5dt1#

我已经尝试了下面的政策,在我的结束使用回声API,但总是得到200 OK结果,因为renewal-period被设置为2秒,所以限制很快就会更新。但在频繁拨打电话后,我看到了“429 Too Many Requests”响应代码。
请检查您是否配置了任何其他策略或创建任何新的API并尝试此策略,因为它给了我预期的结果。

一米

<policies>
<inbound>
<base  />
<rate-limit-by-key  calls="1"  renewal-period="2"  counter-key="@(context.Request.IpAddress)"  increment-condition="@(context.Response.StatusCode == 200)"  />
</inbound>
<backend>
<base  />
</backend>
<outbound>
<base  />
</outbound>
<on-error>
<base  />
</on-error>
</policies>

字符串

Output:


的数据
为了频繁地得到“429 Too Many Requests”响应代码,我将renewal-period增加到30秒,得到了下面的结果。



我也试过<rate-limit-by-key calls="1" renewal-period="2" counter key="@(context.Request.IpAddress.ToString())" increment-condition="@(context.Response.StatusCode == 200)" />策略,它也像我预期的那样工作。

相关问题