我的任务是通过服务双向同步两个邮箱中的联系人文件夹。请多多包涵,因为这是我第一次在 C# 中使用 EWS。
为了唯一标识项目并跟踪同步更改,我使用SyncFolderHierarchy()
子文件夹和SyncFolderItems()
每个子文件夹中的项目,同时跟踪同步状态。
由于文件夹/项目 ID 依赖于邮箱、初始同步以及创建操作,我通过扩展属性标记同步项目Item.SetExtendedProperty()
这非常有效,但我遇到了一个警告。
当用户在 Outlook 中复制和粘贴文件夹或联系人时,它还会复制唯一 ID(扩展属性),使其不再唯一。在这种情况下,我现在在邮箱中有两个具有相同“唯一”ID 的项目,现在该项目有一个模棱两可的匹配项。
基本上:
SyncFolderItems()
被调用,并保存同步状态- 如果项目没有唯一 ID,则使用唯一 ID 进行标记
- 用户复制并粘贴项目
SyncFolderItems()
被调用(具有先前的同步状态),返回Create
用户复制项目的事件- 创建的项目已经有一个唯一的 ID
现在,有人可能会争辩说只是在创建事件中覆盖项目的唯一 ID。
但是,这会导致以下问题:
当我将邮箱 A 中的新项目同步到邮箱 B 时,我还创建了一个项目。现在调用SyncFolderItems()
邮箱 A 后,我还会为我自己的项目检索一个 Create 事件,在这种情况下,它已经合法地分配了一个不能被覆盖的唯一 ID。
我基本上看到两个选项:
以某种方式阻止此扩展属性可复制
阻止 EWS 为我自己创建的项目发送创建。 我知道我可以在
SyncFolderItems()
通话中忽略 ItemID,但我不确定我应该如何跨通话跟踪项目 ID,因为它们可能会根据文档发生变化
有没有人对如何以不同的方式处理这个问题或实施任何一个选项有任何建议?