SharePoint 列表同步
上次修改时间: 2015年3月9日
适用范围: SharePoint Foundation 2010
SharePoint Foundation 中的 Microsoft Sync Framework 实现提供了两项重要功能:列表同步和文档库同步。下面将讨论列表同步以及支持列表同步的重要功能。
列表同步
为了支持列表同步,所有列表项都必须具有用于跟踪版本更新的唯一标识符。SharePoint Foundation 使用 UniqueId 属性来满足这一要求。
列表项版本控制
基于知识的功能所接受或退回的列表项与两个 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) 来检测同步冲突。此外,有些项目更新也是由服务器端操作触发的,例如,对 Author 字段的更新,这些更新基于上载该项目的用户的 ID。
这些服务器操作完成后,必须将更新同步回客户端。如果这些更改仅限于只读服务器字段,则只更新服务器版本,而保留内容版本不变。但是,如果存在对只读服务器字段以外的更改,或者项目内容发生更改,则将同时更新服务器版本和内容版本。此操作被视为由用户执行的浏览器更新。
请注意,以下服务器端操作所产生的某些行为将导致项目内容版本发生更改,因此需要更新客户端:
防病毒检查
IRM 操作
分析操作,如链接修复或属性降级
对列表或内容类型的架构更改
文档事件处理程序更新
更改枚举
由于更新元数据是在上载到服务器时捕获的,因此只有服务器上记录的更改会保留在更改日志中并在更改枚举中提供。换句话说,更改枚举反映服务器上存在的、由客户端提供的知识的最新状态;该知识状态用于查询更改日志,并获取客户端可能感兴趣的更改集。然后,Sync Framework 会根据客户端知识检查查询结果集中的项目,并确定是否应将指定项目发送给客户端。
请注意,客户端知识可能会维护一组查询例外项(项目范围或特定项目),以便从结果集中筛选掉不需要的项目。
对列表项的批量更改
并发更新不是一个持续性的数据流,而是以打包传输的成批项目的形式提供。客户端指定批处理大小,而单个项目按它们在更改日志中的显示顺序返回。
成批项目与服务器知识副本一起传递给客户端。处理完更改后,客户端会将新的服务器知识添加到它们自己的知识库中。最后,客户端将最新获取的服务器版本设置为上次收到的项目的服务器版本字段。
客户端可以根据它对指定批处理中项目的知识,指定一个或多个例外项。使用例外项可确保当同步操作中断时,客户端不会收到虚假冲突。有肯定和否定两种例外项。肯定例外项具有所收到的批处理中项目的完全服务器知识,而否定例外项具有批处理中跳过的项目的初步客户端知识。但请注意,由于在服务器上处理例外项会降低服务器性能,因此客户端应避免对成批更改使用例外项,而是应基于服务器知识调整批处理。
例外项
在以下情况下,服务器会检测并使用例外项信息:
更改枚举
服务器通过 contains() 函数传递项目,该函数可从结果集中筛选掉指定项目。
服务器在 GetListItemChangesWithKnowledge(String, String, XmlNode, XmlNode, String, XmlNode, String, XmlNode, XmlNode) 方法的 MadeWithKnowledge 元素中返回例外项信息。
冲突检测
- 在服务器端检测到冲突时,服务器会为冲突项目创建一个例外项。
项目更新
- 服务器会忽略同步知识中的变更单位例外项。如果它从客户端收到变更单位例外项,则不会在服务器知识中存储此信息。
检测和解决冲突
如果服务器项目上的 ows_hiddenversion 字段与从客户端收到的 ows_hiddenversion 字段的值不同,则服务器上会出现冲突。当出现此类冲突时,服务器不会尝试解决它,而是向其知识中添加项目例外项,并向客户端返回错误。
如果服务器知识的版本与客户端知识不一致,则客户端上会出现冲突。出现这种情况时,客户端必须使用项目的内容版本解决冲突。在这种情况下,为了解决冲突,将会忽略服务器版本。
如果服务器项目的内容版本与客户端项目的客户端知识和内容版本不一致,则会导致最严重的冲突。这被称为"真正的"冲突。Sync Framework 无法解决此类冲突,用户必须通过用户界面来解决它。
如果项目的服务器版本与客户端知识不一致,但内容版本与服务器或客户端知识一致,则会出现虚假冲突。客户端会自动解决此类冲突,而无需用户干预。如果客户端内容版本与服务器知识一致,那么在解决冲突时将保留服务器项目。
解决 true 或 false 冲突将有利于客户端版本。客户端会创建一个联合集,以便将客户端知识与服务器知识结合起来,并将客户端项目上的 ows_hiddenversion 字段设置为服务器项目上存在的值,然后将项目的客户端版本同步到服务器状态。