我们在 API Manager 中配置了一个 API,其中包含一些产品和策略。其中一项策略试图确保某些查询参数始终设置为特定值。
<set-query-parameter name="myParameter" exists-action="override">
<value>myFixedValue</value>
</set-query-parameter>
这工作得很好,直到有人添加具有不同大小写的相同参数,例如。
MyParameter
或 mYpAraMeTeR
,在这种情况下,设置查询参数策略将被忽略,因为它区分大小写。
有没有办法确保以不区分大小写的方式正确应用此策略?
经过一番搜索,我找到了政策
validate-parameters
,我希望它能有所帮助,但到目前为止我还没有找到神奇的属性组合。
<validate-parameters specified-parameter-action="ignore" unspecified-parameter-action="prevent" errors-variable-name="validationErrors">
<headers specified-parameter-action="ignore" unspecified-parameter-action="ignore"/>
<query specified-parameter-action="ignore" unspecified-parameter-action="prevent">
<parameter name="myParameter" action="ignore" />
</query>
<path specified-parameter-action="ignore"/>
</validate-parameters>
我希望这只会传递提供的所有标头和路径,但将允许的查询参数限制为仅
myParameter
希望有更多 APIM 知识的人可以帮助我:)
看起来
validate-parameters
也区分大小写。
正确的政策定义是-
<policies>
<inbound>
<base />
<validate-parameters specified-parameter-action="ignore" unspecified-parameter-action="prevent" errors-variable-name="requestParametersValidation">
<headers specified-parameter-action="ignore" unspecified-parameter-action="ignore" />
<query specified-parameter-action="ignore" unspecified-parameter-action="prevent">
<parameter name="myParameter" action="ignore" />
</query>
</validate-parameters>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
但是,如果您传递
myParameter
参数以外的任何其他值,则会出现错误。它不适用于 myParameter
的大小写值。
因此,或者我使用以下策略,该策略仅适用于
myParameter
,但不适用于 myParameter
参数的任何其他组合。
<policies>
<inbound>
<base />
<choose>
<when condition="@(context.Request.Url.Query.TryGetValue("myParameter", out var value) && value.Any(v => string.Equals(v, "myFixedValue", StringComparison.OrdinalIgnoreCase)))" />
<otherwise>
<return-response>
<set-status code="400" reason="Bad Request" />
<set-header name="Content-Type" exists-action="override">
<value>text/plain</value>
</set-header>
<set-body>@("Only the 'myParameter' query parameter is allowed.")</set-body>
</return-response>
</otherwise>
</choose>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
输出-
追踪-