Azure 存储服务 Api 调用:如何使用 NextPartitionKey 和 NextRowKey?
Azure Storage Services Api Call: How to use NextPartitionKey and NextRowKey?
场景如下:
当前的 MVC5 项目提供了多个视图,其数据是通过使用各种 API 调用来检索的。这些调用仅使用 https://[some_url]
个字符串执行,如果需要则替换变量。
所有调用returnJSON字符串,根据MVC模型转换为objects。我还想指出,这样的应用程序不具有任何数据库,因为它作为流程链中的一个步骤,将创建的 objects 传递给下一个应用程序。
一个调用针对 Azure Table 存储。这个特定的 table 包含几千个条目并且正在稳步增长。使用 "ordinary" API 调用,例如 https://api123.sample.net/application/[...]/
return 仅前 1,000 个条目。
这个SO post, was my starting point, suggesting to modify the URL by adding the query parameters NextParitionKey
and NextRowKey
. A comment in the aforementioned SO post also pointed towards this Microsoft Doc,建议使用相同的方法向查询添加参数。
自从我在 header 中使用 returned x-ms-continuation-NextPartitionKey
和 x-ms-continuation-NextRowKey
以来,我想我应该使用它们来修改我的查询 URL。在 Postman 中输入参数化查询后,我能够修改 URL 并得到 JSON 结果。
然而,这是实际问题,尽管使用了查询参数,API 调用的结果 returned 只有 1,000。比较参数化 URL 调用和之前使用的标准调用的结果,发现 JSON 文件确实不同。
我认为不能更改每次调用 1,000 个条目的限制,但如果可能的话,我将如何使用 URL-based API 调用从该特定数据库中检索所有条目(cf . 下面的方法)?我的意思是,如果使用参数也 returns 每次调用只有 1,000 个条目,怎么可能 "chain" 调用并找出最后一个数据库条目以终止整个过程。
我假设我不能在这种情况下使用 URL-based 方法。是否需要将实际的 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 中的所有实体是更好的方法 table。
如果我们想查询Azure中的所有实体table,我们可以使用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);
场景如下:
当前的 MVC5 项目提供了多个视图,其数据是通过使用各种 API 调用来检索的。这些调用仅使用 https://[some_url]
个字符串执行,如果需要则替换变量。
所有调用returnJSON字符串,根据MVC模型转换为objects。我还想指出,这样的应用程序不具有任何数据库,因为它作为流程链中的一个步骤,将创建的 objects 传递给下一个应用程序。
一个调用针对 Azure Table 存储。这个特定的 table 包含几千个条目并且正在稳步增长。使用 "ordinary" API 调用,例如 https://api123.sample.net/application/[...]/
return 仅前 1,000 个条目。
这个SO post, was my starting point, suggesting to modify the URL by adding the query parameters NextParitionKey
and NextRowKey
. A comment in the aforementioned SO post also pointed towards this Microsoft Doc,建议使用相同的方法向查询添加参数。
自从我在 header 中使用 returned x-ms-continuation-NextPartitionKey
和 x-ms-continuation-NextRowKey
以来,我想我应该使用它们来修改我的查询 URL。在 Postman 中输入参数化查询后,我能够修改 URL 并得到 JSON 结果。
然而,这是实际问题,尽管使用了查询参数,API 调用的结果 returned 只有 1,000。比较参数化 URL 调用和之前使用的标准调用的结果,发现 JSON 文件确实不同。
我认为不能更改每次调用 1,000 个条目的限制,但如果可能的话,我将如何使用 URL-based API 调用从该特定数据库中检索所有条目(cf . 下面的方法)?我的意思是,如果使用参数也 returns 每次调用只有 1,000 个条目,怎么可能 "chain" 调用并找出最后一个数据库条目以终止整个过程。
我假设我不能在这种情况下使用 URL-based 方法。是否需要将实际的 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 中的所有实体是更好的方法 table。
如果我们想查询Azure中的所有实体table,我们可以使用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);