“读取会话不适用于输入会话令牌。”例外

时间:2017-03-21 14:35:28

标签: azure-cosmosdb

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

  

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

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

站在documentation说的话,

  

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

我假设您正在尝试创建一个通用的分页逻辑。根据我对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 DocDB的回购,如果你愿意,你可以免费使用,大多数基于Performance guidelines article和个人经验。

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