Azure Storage Services Api Call: как использовать NextPartitionKey и NextRowKey? - PullRequest
0 голосов
/ 13 января 2020

Сценарий выглядит следующим образом: Текущий проект MVC5 предоставляет несколько представлений, данные которых извлекаются с использованием различных вызовов API. Эти вызовы выполняются с использованием только строк https://[some_url], при необходимости заменяя переменные.

Все вызовы возвращают строки JSON, которые преобразуются в объекты на основе моделей MVC. Я также хотел бы отметить, что приложение как таковое не имеет каких-либо баз данных, поскольку оно служит одним из шагов в цепочке процессов, передавая созданные объекты следующим приложениям.

Один вызов нацелен на Azure Хранение таблицы . Эта конкретная таблица содержит пару тысяч записей и постоянно растет. Использование «обычного» вызова API, такого как https://api123.sample.net/application/[...]/, возвращает только первые 1000 записей.

Этот SO post был моей отправной точкой, предлагая изменить URL, добавив параметры запроса NextParitionKey и NextRowKey. Комментарий в вышеупомянутом сообщении SO также указывал на это Microsoft Do c, предлагая тот же подход добавления параметров в запрос.

Поскольку возвращаемый вызов, который я использовал, x-ms-continuation-NextPartitionKey и x-ms-continuation-NextRowKey в заголовке, я решил использовать их для изменения URL моего запроса. Мне удалось изменить URL, а также получить результат JSON при вводе параметризованного запроса в Postman.

Однако, и это актуальный вопрос, несмотря на использование параметров запроса, результат вызова API вернул только 1000. Сравнение результатов параметризованного URL-вызова и стандартного вызова, использованного ранее, показало, что файлы JSON действительно были разными.

Я полагаю, что нельзя изменить это ограничение в 1000 записей на вызов, но как бы я использовать вызов API на основе URL для извлечения всех записей из этой конкретной базы данных, если это вообще возможно (см. методы ниже)? Я имею в виду, что если использование параметров также возвращает только 1000 записей за вызов, как можно «связать» вызовы и выяснить последнюю запись в базе данных, чтобы завершить весь процесс.

Я предполагаю, что не могу использовать Основанный на URL подход в этом сценарии. Требуется ли извлекать фактический вызов API в надлежащий метод (ссылки приветствуются)?

В качестве дополнительной информации, пожалуйста, рассмотрите следующие методы (примечание: небольшие изменения):

public static string GetJsonDataFromApi()
        {
            var jsonData = "";
            var apiKey = System.Configuration.ConfigurationManager.AppSettings["ApiKey"];
            var url = BuildWebApiUrl();

            if (IsNullOrWhiteSpace(url) && IsNullOrEmpty(url))
                return jsonData;

            var webClient = new WebClient
            {
                Encoding = Encoding.UTF8,
            };

            using (webClient)
            {
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
                webClient.Headers.Add("subscription-key", apiKey);
                try
                {
                    jsonData = webClient.DownloadString(url);
                }
                catch (WebException e)
                {

                }
                return !IsNullOrEmpty(jsonData) ? jsonData : "";
            }
        }

private static string BuildWebApiUrl()
        {
            var tableName = System.Configuration.ConfigurationManager.AppSettings["Table"];
            [some more System.ConfigurationVariables]

            return string.Format(urlTemplate, tableName, nextPartitionKey, nextRowKey);
        }

1 Ответ

0 голосов
/ 14 января 2020

Что касается проблемы, я думаю, что это лучший способ, чтобы мы написали наш код для запроса всех сущностей в таблице Azure.
Если мы хотим запросить все сущности в таблице Azure, мы можем использовать SDK Microsoft.Azure.Cosmos.Table для его реализации.

var acc = new Microsoft.Azure.Cosmos.Table.CloudStorageAccount(
                         new StorageCredentials("account name", "account key"), true);
            var tableClient = acc.CreateCloudTableClient();
            var table = tableClient.GetTableReference("table name");
            TableContinuationToken token = null;
            var entities = new List<MyEntity>();
            do
            {
                var queryResult = table.ExecuteQuerySegmented(new TableQuery<MyEntity>(), token);
                entities.AddRange(queryResult.Results);
                token = queryResult.ContinuationToken;
            } while (token != null);
...