SharePoint 文档库同步
上次修改时间: 2009年12月21日
适用范围: SharePoint Foundation 2010
本文内容
枚举列表项的更改
检索已更改的文档流
在服务器上更新文档
可使用 Microsoft Sync Framework 同步 SharePoint Foundation 文档库中的项。此同步过程与 SharePoint 列表同步中所述的同步过程类似,只不过在文档库同步过程中将传递文档流本身。通过执行两个步骤可实现对文档库的更改的枚举。第一步,枚举对文档库列表项的更改;第二步,下载已更改文档的文档流。由于在使用两步骤过程时可能会发生同步冲突,因此使用 Etag 属性来保持列表项与其文档流的同步。
枚举列表项的更改
枚举列表项的更改需要使用 Etag,它将作为 WebDAV get/put 请求的参数传递。每当在服务器上更新文档流时,将更新文档 Etag 以反映更改。此值稍后在读取和写入操作的过程中将作为列表项属性传递。在更新时,服务器会将列表项中的 Etag 值与文档中的 Etag 值进行比较;客户端反过来会对读取操作进行比较。这将确保列表项和文档流属于同一读取/写入操作。
通过使用用于常规列表的同一 GetListItemChangesWithKnowledge(String, String, XmlNode, XmlNode, String, XmlNode, String, XmlNode, XmlNode) 方法实现对文档库列表项的更改的枚举。此方法调用将为客户端应用程序提供两个项,即文档库中的已更改列表项的列表和当前服务器已知信息。紧接着,在下一个步骤中,可借助表示文件路径和 Etag 的参数利用 WebDAV API 或支持通过 HTTP 的 SOAP(FSSHTTP 或"Cobalt")的文件同步的 API 来访问文件流。
检索已更改的文档流
在枚举列表项的更改后,下一步便是检索已更改文档的文档流。
使用 WebDAV get 方法可检索文档流和文档的 Etag 属性的值。有关检索项的流的详细信息,请参阅获取项的流 (WebDAV)(该链接可能指向英文页面)。如果检索的 Etag 属性的值与列表项属性包中的 Etag 属性的值不同,则表明文档自检索到列表项后已发生更改。客户端应用程序中的逻辑将确定是跳过列表项并检索结果集中的其他项,还是立即重新同步应用程序。
列表项将按照它们在更改日志中的显示顺序返回。因此,在下载列表项的文档流后,客户端可以通过将上一个已知服务器版本设置为处理的项的版本来更新其已知信息。在同步已中断的情况下,这可让客户端从上一个同步文档继续进行同步。
在服务器上更新文档
SharePoint Foundation 支持对文档元数据进行升级和降级。如果在服务器上安装了指定文档类型的分析器,则在上载文档时将对文档调用此分析器以便从文档流中提取属性。然后,将这些属性提升到 MetaInfo 列。如果文档类型没有任何分析器,则不执行属性升级/降级。
通过两个阶段来更新文档:
协议客户端使用 WebDAV 将文档流连同客户端已知的文档 Etag 一起发送到服务器。如果客户端上和服务器上的 Etag 相同,则表明服务器副本自客户端上一次检索更改后未发生更改,并且服务器将接受新的文档版本。在写入文档流后,服务器会将文档的属性提升到列表项列中。然后,它会更新关联的列表项的版本和文档的 Etag,并通过一条响应消息将新的 Etag 发送给客户端。
在收到新的文档 Etag 后,客户端会请求更新后的文档列表项。返回的列表项将带有更新后的 ows_hiddenversion 字段和新的 Etag。客户端将检查列表项中的 Etag 是否与文档中的 Etag 相匹配。如果 Etags 不相同,则表明文档是在完成步骤 1 之后更新的,应从更改枚举开始同步;如果相同,则客户端将使用 ows_hiddenversion 字段的新值更新其客户端版本的列表项。
文档更新会触发对服务器端逻辑的不同调用(从病毒扫描程序到工作流)。此服务器端逻辑可能会触发客户端关注的文档内容更新。客户端将依靠更改枚举过程来确定它是否需要下载更新的文档。客户端必须下载更新文档的内容版本的文档更改,但它无法同步仅修改服务器版本的更改。