"Сеанс чтения недоступен для токена сеанса ввода". исключение
У меня проблема с Azure DocumentDB с одной коллекцией разделов. Всякий раз, когда я пытаюсь программно вставить или запросить какой-либо документ, я получаю исключение с сообщением
"Сеанс чтения недоступен для токена сеанса ввода".
Поскольку эта коллекция была недавно создана, я подумал, что это общая ошибка, и я попытался воссоздать коллекцию в другой базе данных, но затем при попытке создать коллекцию я не могу отправить развертывание, потому что меня спрашивают о ключе раздела. ошибка
Стоя на том, что говорит документация,
"Вам не нужно указывать ключ раздела для этих коллекций".
Может кто-нибудь помочь? Я делаю что-то неправильно? Регион - Западная Европа (если это поможет)
2 ответа
Если вы получаете сообщение об ошибке входного токена сеанса, можете ли вы добавить сюда свой код?
Для решения проблемы на портале, где вы пытаетесь создать коллекцию, выполните следующие действия:
- В поле ключа раздела введите пробел, а затем нажмите "Удалить", в поле должна появиться зеленая галочка.
Это будет исправлено в портале в ближайшее время.
Из вашего кода я предполагаю, что вы пытаетесь создать общую логику разбиения на страницы. Исходя из моего опыта работы с DocDB, нумерация страниц должна выполняться с помощью токена продолжения.
У меня обычно есть расширение, которое получает указанный токен, и затем я использую его для последующих запросов, например так:
/// <summary>
/// Paged results with continuation token
/// </summary>
/// <typeparam name="T"></typeparam>
public class PagedResults<T>
{
public PagedResults()
{
Results = new List<T>();
}
/// <summary>
/// Continuation Token for DocumentDB
/// </summary>
public string ContinuationToken { get; set; }
/// <summary>
/// Results
/// </summary>
public List<T> Results { get; set; }
}
/// <summary>
/// Creates a pagination wrapper with Continuation Token support
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <returns></returns>
public static async Task<PagedResults<T>> ToPagedResults<T>(this IQueryable<T> source)
{
var documentQuery = source.AsDocumentQuery();
var results = new PagedResults<T>();
try
{
var queryResult = await documentQuery.ExecuteNextAsync<T>();
if (!queryResult.Any())
{
return results;
}
results.ContinuationToken = queryResult.ResponseContinuation;
results.Results.AddRange(queryResult);
}
catch
{
//documentQuery.ExecuteNextAsync might throw an Exception if there are no results
return results;
}
return results;
}
Вы можете использовать этот помощник в своем коде вместе с FeedOptions:
var feedOptions = new FeedOptions() { MaxItemCount = sizeOfPage };
var collectionUri = UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId);
PagedResults<T> results = await client.CreateDocumentQuery<T>(collectionUri,feedOptions).Where(predicate).ToPagedResults();
//You can check of the ContinuationToken and use it on another query
if(!string.IsNullOrEmpty(results.ContinuationToken)){
feedOptions.RequestContinuation = results.ContinuationToken;
PagedResults<T> moreResults = await client.CreateDocumentQuery<T>( collectionUri,feedOptions ).Where(predicate).ToPagedResults();
}
Кроме того, я поддерживаю репозиторий на Github, который содержит помощников и провайдеров для DocDB, которых вы можете использовать по своему усмотрению, большинство из них основаны на статье с рекомендациями по производительности и личном опыте.
Еще один совет, попробуйте обновить ваш SDK до последней версии, либо .Net Full Framework, либо .Net Core версии (в зависимости от вашего проекта).