Видимо, я пропускаю поле nextPageToken
в ListObjectsOptions
, используемом для запроса. Без указания этого поля служба не вернет его - потому что кто знает почему!
Этот код должен работать:
async IAsyncEnumerable<string> ListObjectsAsync(
string prefix, [EnumeratorCancellation] CancellationToken cancelToken)
{
var listObjectsOptions = new ListObjectsOptions
{
Fields = "items(name),nextPageToken"
};
var rawResponses = mGoogleClient.ListObjectsAsync(
mBucketName,
prefix,
listObjectsOptions).AsRawResponses();
using (var enumerator = rawResponses.GetEnumerator())
{
while (await enumerator.MoveNext(cancelToken))
{
foreach (var googleObject in enumerator.Current.Items)
yield return googleObject.Name;
}
Console.WriteLine(enumerator.Current.NextPageToken);
}
}
Приятно то, что у вас даже нет использовать NextPageToken
явно. Это значит, что не нужно делать что-то вроде этого:
string token = null;
do
{
var options = new ListObjectsOptions
{
Fields = "items(name),nextPageToken",
PageToen = token
};
var rawResponses = mGoogleClient.ListObjectsAsync(
mBucketName,
prefix,
listObjectsOptions).AsRawResponses();
using (var enumerator = rawResponses.GetEnumerator())
{
while (await enumerator.MoveNext(cancelToken))
{
foreach (var googleObject in enumerator.Current.Items)
yield return googleObject.Name;
}
token = enumerator.Current.NextPageToken;
}
}
while (!string.IsNullOrEmpty(token));
... потому что перечисленный вами счетчик rawResponses.GetEnumerator()
позаботится об использовании токена ответ для автоматической выборки следующего (при необходимости) при их итерации.
Таким образом, первый фрагмент кода действителен для итерации более +1000 объектов за один вызов.