SharePoint リストの同期
最終更新日: 2015年3月9日
適用対象: SharePoint Foundation 2010
SharePoint Foundation に実装された Microsoft Sync Framework は、リストの同期およびドキュメント ライブラリの同期という 2 つの重要な機能を提供します。ここでは、リストの同期の概要と、この操作をサポートする重要な機能について説明します。
リストの同期
リストの同期をサポートするには、バージョンの更新を追跡するためにすべてのリスト アイテムに一意の識別子を割り当てる必要があります。SharePoint Foundation は、UniqueId プロパティを使用してこの要件をサポートします。
リスト アイテムのバージョン付け
ナレッジベースの関数が受け取る、または返すリスト アイテムは、2 つの Sync Framework バージョン変更単位に関連付けられます。一方はリスト アイテムのサーバー バージョンを表し、もう一方はコンテンツ バージョンを表します。サーバーの変更単位のバージョンは、読み取り専用サーバー フィールドが変更されると更新されます。コンテンツの変更単位のバージョンは、リスト アイテムの他の部分が変更されると更新されます。
サーバーおよびコンテンツの変更単位のバージョンは、常にペアで更新されるように評価されます。これは、更新が読み取り専用サーバー フィールドのみに行われ、クライアントへの更新が必要とされない場合も同じです。次の一覧は、サーバーの変更単位への変更に関連付けられた読み取り専用サーバー フィールドを示しています。
読み取り専用サーバー フィールド
1 |
ID |
2 |
ows_hiddenversion |
3 |
ContentTypeId |
4 |
ContentType |
5 |
Modified |
6 |
Created |
7 |
Author |
8 |
Editor |
9 |
FileRef |
10 |
FileDirRef |
11 |
LastModified |
12 |
CreatedDate |
13 |
FileSize |
14 |
FSObjType |
15 |
PermMask |
16 |
CheckoutUser |
17 |
VirusStatus |
18 |
InstanceID |
19 |
_CheckinComment |
20 |
_Level |
21 |
_IsCurrentVersion |
22 |
_HasCopyDestination |
23 |
_CopySource |
24 |
_ModerationStatus |
25 |
_ModerationStatus |
26 |
WorkflowVersion |
サーバーへの更新
リスト アイテムの更新は、アップグレードの操作中にサーバー側で取り込まれます。このようにすることで、複数のブラウザー クライアントが同じアイテムを同時に更新しようとした場合でも更新の競合を回避できます。サーバー上でアップロードを更新する必要があるのは、Sync Framework がコア SharePoint バージョン フィールド (ows_hiddenversion) を使用して同期の競合を検出するからです。また、サーバー側のアクションによって発生するアイテム更新もあります。たとえば、アイテムをアップロードするユーザーの ID に基づいて Author フィールドを更新することが、これに当てはまります。
これらのサーバー アクションを完了した後で、更新をクライアントに同期する必要があります。変更が読み取り専用サーバー フィールドに限定される場合、サーバー バージョンのみが更新され、コンテンツ バージョンは以前と変わりません。ただし、読み取り専用サーバー フィールド以外への変更があった場合、つまりアイテム コンテンツが変更された場合、サーバーとコンテンツの両方のバージョンが更新されます。この操作は、ユーザーがブラウザーで行った更新として処理されます。
次のサーバー側処理によるアクションがアイテムのコンテンツ バージョンの変更につながり、クライアントへの更新を必要とすることに注意してください。
アンチウイルス チェック
IRM アクション
リンクの修復、プロパティの降格などの解析処理
リストまたはコンテンツのスキーマへの変更
ドキュメント イベント ハンドラーの更新
変更の列挙
メタデータの更新はサーバーへのアップロード中に取り込まれるため、サーバー上で記録された変更のみが変更ログに保存され、変更の列挙に提供されます。つまり、変更の列挙には、サーバー上に存在する、クライアントから提供されたナレッジの最新の状態が反映されます。このナレッジの状態は、変更ログに対してクエリを実行し、クライアントに影響する一連の変更を取得するために使用されます。その後で、Sync Framework は、クエリの結果セットに含まれるアイテムをクライアントのナレッジと照合してから、指定されたアイテムをクライアントに送信するかどうかを決定します。
クライアントのナレッジには、一連のクエリ例外が保持される場合があることに注意してください。クエリ例外は、不要なアイテムを結果セットからフィルター処理する、アイテム範囲または個別アイテムです。
リスト アイテムのバッチ変更
一連の更新を連続的なストリームとして実行するのではなく同時に実行する場合、パケットで転送されるアイテム バッチが使用されます。クライアントはバッチのサイズを指定し、個別アイテムは変更ログに記録された順序で返されます。
バッチは、サーバーのナレッジのコピーと共にクライアントに渡されます。クライアントは、変更を処理した後で新しいサーバーのナレッジをクライアント側のナレッジ ストアに追加します。最後に、クライアントは、取得した最新のサーバー バージョンを最後に受け取ったアイテムのサーバー バージョン フィールドに設定します。
クライアントは、指定したバッチ内のアイテムのナレッジに対して、1 つ以上の例外を指定することができます。例外を使用することで、同期の操作が割り込まれた場合に偽の競合が発生することを確実に回避できます。例外には、正の例外と負の例外があります。正の例外ではアイテムに関して受け取られた完全なサーバーのナレッジがバッチに含まれますが、負の例外ではスキップするアイテムの初期クライアント ナレッジがバッチに含まれます。ただし、サーバー上で例外を処理することはサーバーのパフォーマンス低下を招くため、クライアントはバッチ変更に例外を使用することを避けて、代わりにサーバーのナレッジに基づいてバッチを整理する必要があります。
例外
サーバーは、次の状況で例外情報を検出し、使用します。
変更の列挙
サーバーは、指定されたアイテムを結果セットからフィルター処理する contains() 関数を使用して、アイテムを渡します。
サーバーは、例外情報を GetListItemChangesWithKnowledge(String, String, XmlNode, XmlNode, String, XmlNode, String, XmlNode, XmlNode) メソッドの MadeWithKnowledge 要素に返します。
競合の検出
- 競合がサーバー側で検出されると、サーバーはアイテムの競合に関する例外を作成します。
アイテムの更新
- サーバーは、同期のナレッジにおける変更単位の例外を無視します。この情報をクライアントから受け取った場合、サーバーは変更単位の例外をサーバーのナレッジに保存しません。
競合の検出と復元
サーバー側で競合が発生するのは、サーバー アイテムの ows_hiddenversion フィールドが、クライアントから受け取った ows_hiddenversion フィールドの値と異なる場合です。このような競合が発生しても、サーバーは競合を解決しようとはしません。そうする代わりに、サーバーはアイテムの例外をサーバーのナレッジに追加し、エラーをクライアントに返します。
クライアント側で競合が発生するのは、サーバーのナレッジのバージョンがクライアントのナレッジと一致しない場合です。この状況が発生すると、クライアントはアイテムのコンテンツ バージョンを使用して競合を解決する必要があります。このシナリオでは、サーバーのバージョンは競合の解決に使用されません。
最も深刻な競合が発生するのは、サーバー アイテムのコンテンツ バージョンがクライアントのナレッジと一致しないと同時に、クライアント アイテムのコンテンツ バージョンがサーバーのナレッジと一致しない場合です。これは、"真の" 競合と呼ばれます。Sync Framework は、このような競合を解決できません。ユーザーが、ユーザー インターフェイスを使用して競合を修正する必要があります。
偽の競合が発生するのは、アイテムのサーバー バージョンがクライアントのナレッジと一致しないが、コンテンツ バージョンはサーバーまたはクライアントのナレッジと一致する場合です。この種類の競合は、ユーザーが介入しなくてもクライアント側で自動的に解決されます。クライアントのコンテンツ バージョンがサーバーのナレッジと一致するなら、サーバー アイテムが競合解決の勝者となります。
true (真) または false (偽) の競合がクライアントのバージョンを優先して解決されると、クライアントは、クライアントのナレッジをサーバーのナレッジと結合する和集合セットを作成し、クライアント アイテムの ows_hiddenversion フィールドを、サーバー アイテムに存在する値に設定してから、アイテムのクライアント バージョンをサーバーの状態に同期します。