如何在 Azure APIM 中禁用基于 azure 订阅的速率限制策略

How to disable rate limit policy based on the azure subscription in Azure APIM

我有一个针对不同环境使用单个 policy.xml 的用例,但是速率限制仅适用于特定环境。

例如:

Dev:速率限制适用(托管在 dev azure 订阅中)

QA:速率限制不适用(托管在测试 Azure 订阅中)

Prod:速率限制适用(托管在 prod Azure 订阅中)

更新: 从此处 :

的其中一篇帖子中尝试过此操作
    <choose>
        <when condition="@(context.Subscription.Name=="abcd")">
            <rate-limit-by-key calls="1" renewal-period="15" counter-key="@(context.Subscription.Id)" />
        </when>
        <when condition="@(context.Subscription.Name=="efgh")">
            <rate-limit-by-key calls="2" renewal-period="15" counter-key="@(context.Subscription.Id)" />
        </when>
        <otherwise />
    </choose>

下面的片段来自入站请求,我不明白的是第一个 when 元素条件属性的值是 false 即使它是从“abcd”订阅执行的。

choose (7.565 ms)
    {
    "message": "Expression was successfully evaluated.",
    "expression": "context.Subscription.Name==\"abcd\"",
    "value": false
}
choose (0.251 ms)
    {
    "message": "Expression was successfully evaluated.",
    "expression": "context.Subscription.Name==\"efgh\"",
    "value": false
} 

通过以下方法对我有用的解决方案:

<choose>
    <when condition="@(context.Request.Url.Host.Contains("dev"))">
        <rate-limit-by-key calls="1" renewal-period="5" counter-key="@(context.Subscription.Id)" />
    </when>
    <when condition="@(context.Request.OriginalUrl.Host.Contains("prod")">
        <rate-limit-by-key calls="2" renewal-period="10" counter-key="@(context.Subscription.Id)" />
    </when>
    <otherwise />
</choose>

1.The 基于订阅密钥的方法如下。

您可以为每个环境定义一个订阅密钥。在下面的示例中,我在开发环境中创建了一个名为 dev 的订阅,在生产环境中创建了一个名为 prod 的订阅。您可以查看此 link to understand how to create a subscription key. Once you creaete subscription keys on all three environment. You can add the following policy to your inbound 政策。

<choose>
        <when condition="@(context.Subscription.Name=="dev")">
            <rate-limit-by-key calls="10000" renewal-period="15" counter-key="@(context.Subscription.Id)" />
        </when>
        <when condition="@(context.Subscription.Name=="prod")">
            <rate-limit-by-key calls="10000" renewal-period="15" counter-key="@(context.Subscription.Id)" />
        </when>
        <otherwise />
    </choose>

完成此操作后,下一步是您需要确保此订阅密钥由客户端发送。您可以在设置中启用此功能。

如果您不想创建和维护订阅。还有另一种方法。这里的条件可以根据资源的名称。

2。第二种方法很简单,就是引用 context

中的任何变量

在这里你可以引用一个变量来区分你的环境。像下面这样。

<choose>
        <when condition="@(context.Request.OriginalUrl.Host=="www.devenvironment.com")">
            <rate-limit-by-key calls="10000" renewal-period="15" counter-key="@(context.Subscription.Id)" />
        </when>
        <when condition="@(context.Request.OriginalUrl.Host=="www.prodenvironment.com")">
            <rate-limit-by-key calls="10000" renewal-period="15" counter-key="@(context.Subscription.Id)" />
        </when>
        <otherwise />
    </choose>

我认为如果除了环境之外没有任何其他限制,第二个很容易。您实际上可以引用上下文中可用的任何属性,而不仅仅是 context.Request.OriginalUrl.Host

编辑:关于为什么这个 中的示例没有像您期望的那样执行是:context.Subscription.Name 不是您的 azure 的订阅。它是您在 API 管理器下创建的订阅,客户端可以使用它访问 API。我希望我的回答描述有适当的链接