Мне бы хотелось, чтобы один из моих API в Службе управления API вызвал хранимую процедуру в CosmosDB и возвратил ее результат. Кажется, по этому вопросу не так много документации.
Моя попытка до сих пор:
- Интерфейс: метод GET с тремя параметрами
- Входящая обработка: я адаптировал код из этого вопроса следующим образом
</p>
<pre><code><policies>
<inbound>
<base />
<set-variable name="Content-Type" value="application/query+json" />
<set-variable name="x-ms-documentdb-isquery" value="True" />
<set-variable name="x-ms-documentdb-query-enablecrosspartition" value="False" />
<set-variable name="x-ms-max-item-count" value="1000" />
<set-variable name="x-ms-version" value="2017-02-22" />
<set-variable name="x-ms-date" value="@( DateTime.UtcNow.ToString("R") )" />
<set-header name="Content-Type" exists-action="override">
<value>@((string)context.Variables["Content-Type"])</value>
</set-header>
<set-header name="x-ms-documentdb-isquery" exists-action="override">
<value>@((string)context.Variables["x-ms-documentdb-isquery"])</value>
</set-header>
<set-header name="x-ms-documentdb-query-enablecrosspartition" exists-action="override">
<value>@((string)context.Variables["x-ms-documentdb-query-enablecrosspartition"])</value>
</set-header>
<set-header name="x-ms-max-item-count" exists-action="override">
<value>@((string)context.Variables["x-ms-max-item-count"])</value>
</set-header>
<set-header name="x-ms-version" exists-action="override">
<value>@((string)context.Variables["x-ms-version"])</value>
</set-header>
<set-header name="x-ms-documentdb-partitionkey" exists-action="override">
<value>@("[\""+context.Subscription.Id+"\"]")</value>
</set-header>
<set-header name="x-ms-date" exists-action="override">
<value>@( (string)context.Variables["x-ms-date"] )</value>
</set-header>
<set-variable name="StringToSign" value="@(string.Format("post\nsprocs\ndbs/{myDBName}/colls/{myCollName}\n{0}\n\n", ((string)context.Variables["x-ms-date"]).ToLowerInvariant()))" />
<set-variable name="cosmosreadwritekey" value="{{MyMasterKeyInReadWriteMode}}" />
<set-variable name="SharedKey" value="@{
// https://docs.microsoft.com/en-us/rest/api/documentdb/access-control-on-documentdb-resources#constructkeytoken
System.Security.Cryptography.HMACSHA256 hasher = new System.Security.Cryptography.HMACSHA256(Convert.FromBase64String((string)context.Variables["cosmosreadwritekey"]));
return Convert.ToBase64String(hasher.ComputeHash(System.Text.Encoding.UTF8.GetBytes((string)context.Variables["StringToSign"])));
}" />
<set-variable name="Authorization" value="@(string.Format("type=master&ver=1.0&sig={0}", ((string)context.Variables["SharedKey"]).Replace("&","%26").Replace("+","%2B").Replace("=","%3D")))" />
<set-header name="Authorization" exists-action="override">
<value>@((string)context.Variables["Authorization"])</value>
</set-header>
<set-backend-service base-url="https://{myCosmosName}.documents.azure.com" />
<rewrite-uri template="/dbs/{myDBName}/colls/{myCollName}/sprocs" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
- Backend: HTTPS заканчивается со следующим URL: https://{myCosmosName}.documents.azure.com/
Однако, когда я тестирую API, я систематически получаю следующее сообщение об ошибке:
Входной токен авторизации не может обслуживать запрос. Пожалуйста, проверьте, что ожидаемая полезная нагрузка построена в соответствии с протоколом, и проверьте используемый ключ. Сервер использовал следующую полезную нагрузку для подписи: 'get \ nsprocs \ ndbs / {myDBName} / colls / {myDBName} \ ntue, 18 сентября 2018 09:31:58 gmt \ n \ n' \ r \ nActivityId: 64586521-cf37- 44e5-80a4-bac0a9d3b261, Microsoft.Azure.Documents.Common / 2.0.0.0
Мои вопросы оттуда:
- Как я могу заставить этот вызов работать для моей хранимой процедуры?
- Как передать параметры API для вызова хранимой процедуры?