Azure Storage Services API Call:如何使用 NextPartitionKey 和 Next



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

所有调用都返回 JSON 字符串,这些字符串基于 MVC 模型转换为对象。我还想指出,这样的应用程序没有任何数据库,因为它充当流程链中的一个步骤,将创建的对象传递给下一个应用程序。

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

这个SO帖子是我的起点,建议通过添加查询参数来修改URLNextParitionKeyNextRowKey.上述SO帖子中的评论也指向了此Microsoft文档,建议向查询添加参数的相同方法。

由于我一直在使用的调用在标头中返回x-ms-continuation-NextPartitionKeyx-ms-continuation-NextRowKey,我想我应该使用这些来修改我的查询 URL。我能够修改 URL,并且在 Postman 中输入参数化查询时也得到了 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);
}

关于这个问题,我认为我们编写代码来查询 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);

相关内容

最新更新