首页 文章

“读取会话不适用于输入会话令牌 . ”异常

提问于
浏览
1

我在使用单个partion集合的Azure DocumentDB上遇到了问题 . 每当我尝试以编程方式插入或查询任何文档时,我都会收到一条消息说明的异常

“读取会话不适用于输入会话令牌 . ”

由于这个集合是新创建的,我认为这是一个通用错误,我试图在另一个数据库上重新创建集合,但是当我尝试创建集合时,我无法提交部署,因为我被问到分区键 . error

站在documentation所说的,

“您不必为这些集合指定分区键 . ”

有人可以帮忙吗?难道我做错了什么?该地区是西欧(如果它有帮助)

2 回答

  • 0

    我假设您正在尝试创建一个通用的 pagination 逻辑 . 根据我对DocDB的经验,需要使用Continuation Token来实现分页 .

    我通常有an extension获得所述令牌,然后我在后续请求中使用它,如下所示:

    /// <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上维护一个包含helpers and providers for DocDB的回购,如果你愿意,你可以自由使用,大多数基于Performance guidelines article和个人经验 .

    另一个建议,尝试将您的SDK更新到最新版本,.Net Full framework.Net Core版本(取决于您的项目) .

  • 0

    对于输入会话令牌的错误,您可以在此处添加代码吗?

    对于您尝试创建集合的门户网站中的问题,请执行以下操作:

    • 在分区键框中输入空格然后按删除键,框中会出现绿色复选标记 .

    这将很快在门户网站中修复 .

相关问题