我们有基于此policy sample的现有生产服务,该服务通过客户授权流程获取承载令牌。但是,我们想将客户端应用程序设置切换到新应用程序,这需要更新4个命名值。高吞吐量的流量怎么办?
我们将命名值对更新为documented,并查看了REST API。值只有1比1的更新。我们将此应用在较小容量的环境中没有问题。但是,当我们在生产环境中应用此功能时,就会出现中断,而表达式无法解析该值,这将导致null并导致中断。
这是从门户网站复制的策略。
<choose>
<when condition="@(!context.Variables.ContainsKey("access_token"))">
<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}}&resource={{scope}}&client_secret={{clientsecret}}&grant_type=client_credentials";}</set-body>
</send-request>
<set-variable name="responseJson" value="@(((IResponse)context.Variables["response"]).Body.As<JObject>())" />
<set-variable name="access_token" value="@("Bearer " + (String)((JObject)context.Variables["responseJson"])["access_token"])" />
<set-variable name="expires_in" value="@((int)((JObject)context.Variables["responseJson"])["expires_in"] - 20)" />
<cache-store-value key="access_token" value="@((string)context.Variables["access_token"])" duration="@(((int)context.Variables["expires_in"]))" />
</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
}
我怀疑问题与这些变量之一为空有关,但我们的日志不清楚哪个变量。
答案 0 :(得分:0)
没有API可以通过解剖方式更新多个命名值属性。我想到两种方法。您可以将所有值存储在单个命名值中,然后将它们编码为单个字符串并在策略内部进行解析。
或者您可以有两组命名值,而第五组控制使用哪一组。这样,您就可以自由地自由更新被动集,以后再激活它。