Как обновить именованные значения Azure API Management в пакете? - PullRequest
0 голосов
/ 21 июня 2019

У нас есть существующие производственные сервисы, основанные на этом образце политики , который получает токен на предъявителя через поток грантов клиента.Однако мы хотим переключить настройки клиентского приложения на новое приложение, которое требует обновления 4 именованных значений.Как это можно сделать с большими объемами трафика?

Мы обновили именованные пары значений как документированные , и мы рассмотрели REST API .Существует только одно-в-1 обновление значений.Мы применили это в средах с меньшим объемом без проблем.Однако, когда мы применили это в производственных средах, у нас были сбои с выражением, неспособным проанализировать значение, что приводит к нулевому значению и вызывало сбои.

Это была политика, скопированная с портала.

        <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
}

Я подозревал, что проблема связана с тем, что одна из этих переменных имеет значение null, но в наших журналах неясно, какая именно переменная.

1 Ответ

0 голосов
/ 23 июня 2019

Не существует API для анатомического обновления нескольких свойств именованных значений.На ум приходят два подхода.Вы можете хранить все свои значения в одном именованном значении, кодируя их в одну строку и анализируя внутри политики.

Или вы можете иметь два набора именованных значений и пятое, определяющее, какой из них использовать.Таким образом, вы сможете свободно обновлять свой пассивный набор и активировать его только позже.

...