我的任务是用一项服务双向同步两个邮箱中的联系人文件夹。请耐心等待,因为这是我第一次在C#中使用EWS。
为了唯一地标识项目并跟踪同步的更改,我将SyncFolderHierarchy()
用于子文件夹,SyncFolderItems()
用于每个子文件夹中的项目,同时跟踪同步状态。
由于文件夹/项目ID取决于邮箱、初始同步以及创建操作,因此我通过Item.SetExtendedProperty()
用扩展属性标记同步项目
这确实很有效,但我遇到了一个警告。
当用户在Outlook中复制和粘贴文件夹或联系人时,它还会复制唯一ID(扩展属性(,使其不再那么唯一。在这种情况下,我现在在一个邮箱中有两个具有相同"唯一"ID的项目,并且现在该项目的匹配不明确。
基本上:
SyncFolderItems()
被调用,同步状态被保存- 如果项目没有唯一ID,则使用唯一ID进行标记
- 用户复制并粘贴项目
- 调用
SyncFolderItems()
(具有以前的同步状态(,为用户复制的项目返回Create
事件 - 创建的项目已具有唯一ID
现在,有人可能会争辩说,只需覆盖创建事件中项目的唯一ID。
但是,这会导致以下问题:
当我将新项目从邮箱a同步到邮箱B时,我也会创建一个项目。一旦现在调用了邮箱A上的SyncFolderItems()
,我还会为我自己的项目检索一个Create事件,在这种情况下,它已经合法地分配了一个不能被覆盖的唯一ID。
我基本上看到两种选择:
-
以某种方式阻止此扩展属性可复制
-
阻止EWS发送我自己创建的项目的创建。我知道我可以在
SyncFolderItems()
调用中忽略ItemID,但我不确定如何在调用中跟踪项目ID,因为它们可能会根据文档更改
有人对如何以不同的方式处理或实施任一选项有任何建议吗??
Exchange id也应该是您的唯一id。把你的id保留在物品上真的不值得——首先,这需要对该物品进行修改(即使是你造成了更改,也会产生更改事件(,其次,正如你已经注意到的那样,你最终可能会发现同一物品的重复或三重。
对于约会来说,情况更糟——每次传入的约会更新都会导致Outlook重新创建约会,导致使用新的id并清除您的自定义属性。