0

场景如下: 当前的MVC5项目提供了几个视图,通过各种API调用来获取这些视图的数据。这些调用仅使用https://[some_url]字符串执行,如果需要替换变量。

所有调用都返回 JSON 字符串,这些字符串根据 MVC 模型转换为对象。我还想指出,该应用程序本身不具有任何数据库,因为它作为一系列流程中的一个步骤,将创建的对象传递给下一个应用程序。

一个电话针对的是Azure 表存储。这个特殊的表包含几千个条目并且正在稳步增长。使用“普通”API 调用,例如https://api123.sample.net/application/[...]/仅返回前 1,000 个条目。

这个SO post是我的出发点,建议通过添加查询参数来修改 URLNextParitionKeyNextRowKey. 上述 SO 帖子中的一条评论也指向这个Microsoft Doc,建议使用相同的方法向查询中添加参数。

由于我一直在使用的调用返回x-ms-continuation-NextPartitionKeyx-ms-continuation-NextRowKey在标题中,我想我应该使用这些来修改我的查询 URL。在 Postman 中输入参数化查询后,我能够修改 URL 并获得 JSON 结果。

但是,这是实际的问题,尽管使用了查询参数,但 API 调用的结果仅返回 1,000。比较参数化 URL 调用和之前使用的标准调用的结果,发现 JSON 文件确实不同。

我认为无法更改每次调用 1,000 个条目的限制,但是如果可能的话,我将如何使用基于 URL 的 API 调用从该特定数据库中检索所有条目(参见下面的方法)?我的意思是,如果使用参数每次调用也只返回 1,000 个条目,那么如何“链接”调用并找出最后一个数据库条目来终止整个过程。

我假设在这种情况下我不能使用基于 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);
        }

4

1 回答 1

0

关于这个问题,我认为我们编写代码来查询 Azure 表中的所有实体是一种更好的方法。
如果我们想查询 Azure 表中的所有实体,我们可以使用 SDKMicrosoft.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);
于 2020-01-14T06:13:55.670 回答