如何批量更新Azure API管理命名值?

时间:2019-06-21 18:42:24

标签: azure-api-management

我们有基于此policy sample的现有生产服务,该服务通过客户授权流程获取承载令牌。但是,我们想将客户端应用程序设置切换到新应用程序,这需要更新4个命名值。高吞吐量的流量怎么办?

我们将命名值对更新为documented,并查看了REST API。值只有1比1的更新。我们将此应用在较小容量的环境中没有问题。但是,当我们在生产环境中应用此功能时,就会出现中断,而表达式无法解析该值,这将导致null并导致中断。

这是从门户网站复制的策略。

        <choose>
            <when condition="@(!context.Variables.ContainsKey(&quot;access_token&quot;))">
                <send-request ignore-error="true" timeout="20" response-variable-name="response" mode="new">
                    <set-url>{{authorizationServer}}</set-url>
                    <set-method id="apim-generated-policy">POST</set-method>
                    <set-header name="Content-Type" exists-action="override">
                        <value>application/x-www-form-urlencoded</value>
                    </set-header>
                    <set-body>@{return "client_id={{clientid}}&amp;resource={{scope}}&amp;client_secret={{clientsecret}}&amp;grant_type=client_credentials";}</set-body>
                </send-request>
                <set-variable name="responseJson" value="@(((IResponse)context.Variables[&quot;response&quot;]).Body.As&lt;JObject&gt;())" />
                <set-variable name="access_token" value="@(&quot;Bearer &quot; + (String)((JObject)context.Variables[&quot;responseJson&quot;])[&quot;access_token&quot;])" />
                <set-variable name="expires_in" value="@((int)((JObject)context.Variables[&quot;responseJson&quot;])[&quot;expires_in&quot;] - 20)" />
                <cache-store-value key="access_token" value="@((string)context.Variables[&quot;access_token&quot;])" duration="@(((int)context.Variables[&quot;expires_in&quot;]))" />
            </when>
        </choose>
        <set-header name="Authorization" exists-action="override">
            <value>@((string)context.Variables["access_token"])</value>
        </set-header>
  "Elapsed": 109,
  "Source": "set-variable[3]",
  "Reason": null,
  "Message": "Expression evaluation failed. Value cannot be null.\r\nParameter name: value\r\n   at Newtonsoft.Json.Linq.JToken.EnsureValue(JToken value)\r\n   at Newtonsoft.Json.Linq.JToken.op_Explicit(JToken value)",
  "Scope": "product",
  "Section": "inbound",
  "Path": "choose\\when[1]",
  "PolicyId": "",
  "TransportErrorCode": 0,
  "HttpErrorCode": 0
}

我怀疑问题与这些变量之一为空有关,但我们的日志不清楚哪个变量。

1 个答案:

答案 0 :(得分:0)

没有API可以通过解剖方式更新多个命名值属性。我想到两种方法。您可以将所有值存储在单个命名值中,然后将它们编码为单个字符串并在策略内部进行解析。

或者您可以有两组命名值,而第五组控制使用哪一组。这样,您就可以自由地自由更新被动集,以后再激活它。