У нас есть существующие производственные сервисы, основанные на этом образце политики , который получает токен на предъявителя через поток грантов клиента.Однако мы хотим переключить настройки клиентского приложения на новое приложение, которое требует обновления 4 именованных значений.Как это можно сделать с большими объемами трафика?
Мы обновили именованные пары значений как документированные , и мы рассмотрели REST API .Существует только одно-в-1 обновление значений.Мы применили это в средах с меньшим объемом без проблем.Однако, когда мы применили это в производственных средах, у нас были сбои с выражением, неспособным проанализировать значение, что приводит к нулевому значению и вызывало сбои.
Это была политика, скопированная с портала.
<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
}
Я подозревал, что проблема связана с тем, что одна из этих переменных имеет значение null, но в наших журналах неясно, какая именно переменная.