2017-03-21 6 views
0

私は、1つのpartionコレクションでAzure DocumentDBに問題があります。 は、私はプログラムで任意の文書を挿入または照会しようとするたびに、私は"読み込みセッションは入力セッショントークンで使用できません。"例外

を言っメッセージと例外を取得する「をお読みのセッションは、入力されたセッショントークンは使用できません。」

このコレクションは新しく作成されたため、これは一般的なエラーだと思って別のデータベースにコレクションを再作成しようとしましたが、コレクションを作成しようとすると、パーティションキーの「あなたはこれらのコレクションのためのパーティション・キーを指定する必要はありません。」 error

documentationが言うに立ち、

誰かが助けることができますか?私は何か間違っているのですか? 地域は西ヨーロッパです(役立つ場合)

+0

'client'作成/初期化コードを追加できますか?あなたはそれをキャッシングしているか、毎回それを作り直していますか? –

答えて

0

入力セッショントークンについてのエラーが表示されている場合は、ここにコードを追加できますか?あなたは次の操作を行い、コレクションを作成しようとしているポータルでの問題のために

:その後、パーティション・キーボックスで

  • 、スペースを入力しては、Deleteキーを押し、あなたは緑のチェックマークを取得する必要があります箱の中。

これはまもなくポータルで修正されます。

+0

IDocumentQuery クエリ= client.CreateDocumentQuery ( UriFactory.CreateDocumentCollectionUri(DatabaseId、CollectionId)) .Where(述語) 。AsDocumentQuery(); リスト結果=新しいリスト(); 一方(query.HasMoreResults) {results.AddRange(query.ExecuteNextAsync ()を待ちます)。 } 結果を返します。 –

+0

「読み込みセッションは入力セッショントークンに使用できません」というエラーは.NET SDK 1.11.4で修正されました。最新のSDKにアップグレードし、このエラーが引き続き表示される場合はお知らせください。はいの場合は、Microsoft DOT comのaskdocdbに、失敗したリクエストのActivityIdを電子メールで送信してください。 –

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のが含まれているリポジトリをDocDB用に維持しています。必要に応じて自由に使用できます。ほとんどはPerformance guidelines articleと個人的な経験に基づいています。

もう1つのアドバイスは、SDKを.Net Full frameworkまたは.Net Coreバージョン(プロジェクトによって異なる)の最新バージョンにアップデートしてみてください。

+0

この方法は、今日の「事故」から多くの失敗の1つです。このメソッドの目的は、5つのアイテムしか取得できないことです(申し訳ありませんが、私ははっきりしていませんでしたが、ホームページの結果をロードする際に最初に例外がスローされています)。 FeedOptionsと継続トークンを使用しています(つまり、VARオプション=新しいFeedOptions {MaxItemCount = PAGECOUNT、EnableScanInQuery =真}) 私はヘルパーを見て、Gitのレポを持っていたし、全部が面白い発見、しかしあなたの助けをありがとう! –

関連する問題