在Azure API Management中,我需要检查是否设置了查询参数。为此,我尝试使用context.Request.Url.Query.GetValueOrDefault(queryParameterName: string, defaultValue: string)
。
根据documentation,此表达式的作用如下 -
如果找不到参数,则返回逗号分隔的查询参数值或defaultValue。
考虑到这一点,我使用了MS博客Policy Expressions in Azure API Management中的示例来创建以下<inbound>
政策 -
<set-variable name="uniqueId" value="@(context.Request.Url.Query.GetValueOrDefault("uniqueId", ""))" />
但是,每当我加入此政策时,执行都会因 404资源未找到而失败。在检查跟踪时,我可以看到在评估单个策略之前执行被中止而没有错误(无论上述策略放在<inbound>
内的哪个位置。
此行为会导致以下<backend>
跟踪,这解释了 404
"backend": [
{
"source": "configuration",
"timestamp": "2017-09-07T12:42:13.8974772Z",
"elapsed": "00:00:00.0003536",
"data": {
"message": "Unable to identify Api or Operation for this request. Responding to the caller with 404 Resource Not Found."
}
}
],
鉴于MS文档似乎不准确,如何检查是否设置了查询参数?
答案 0 :(得分:2)
所以这里的答案是(另一个)MS bug。
最初创建API操作时,uniqueId
查询参数已根据需要进行设置。我更改了这个,以便在添加我的问题中描述的策略之前不需要它,但是新Azure门户中的错误意味着当您取消选中查询参数旁边的必需框然后保存变化,他们被忽略。
我能够解决此问题,在 OpenAPPI规范视图中编辑YAML模板,删除相关查询参数的声明required: true
。我的政策中的表达现在按预期工作。
请注意: 此解决方法揭示了另一个错误,保存模板会导致您的政策被删除,因此请务必注意先复制。