"Сеанс чтения недоступен для токена сеанса ввода". исключение

У меня проблема с 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 версии (в зависимости от вашего проекта).

Другие вопросы по тегам