我的任务是双向同步服务中两个邮箱中的联系人文件夹。 请多多包涵,因为这是我第一次在C#中使用EWS。
为了唯一地标识项目并跟踪更改以进行同步,我在跟踪同步状态的同时,将SyncFolderHierarchy()
用于子文件夹,将SyncFolderItems()
用于每个子文件夹中的项目。
由于文件夹/项目ID在邮箱中,在初始同步以及在创建操作时都是独立的,所以我通过Item.SetExtendedProperty()
标记具有扩展属性的同步项目
这确实很好,但我遇到了警告。
当用户在Outlook中复制并粘贴文件夹或联系人时,它还会复制唯一ID(扩展属性),从而使其不再那么独特。 在那种情况下,我现在在邮箱中有两个具有相同“唯一” ID的项目,并且现在对该项目有一个不明确的匹配。
基本上:
SyncFolderItems()
被调用,并保存了同步状态SyncFolderItems()
被调用(具有先前的同步状态),为用户复制的项目返回一个Create
事件现在,有人可能会争辩说,只是在创建事件中覆盖项目的唯一ID。
但是,这会导致以下问题:
当我将新内容从邮箱A同步到邮箱B时,我还将创建一个项目。
现在调用了邮箱A上的SyncFolderItems()
之后,我还将为自己的项目检索一个Create事件,在这种情况下,该事件已经合法地分配了一个唯一的ID,该ID不能被覆盖。
我基本上看到两个选择:
以某种方式阻止了此扩展属性的复制
防止EWS发送我自己创建的商品的商品。
我知道我可以在SyncFolderItems()
通话中忽略ItemID,但是我不确定如何在通话中跟踪商品ID,因为它们可能会根据documentation < / p>
有人对如何以不同的方式解决这个问题或实施任一选择有任何建议吗?
答案 0 :(得分:1)
Exchange ID也应该确实是您的唯一ID。将ID保留在商品本身上确实不值得-首先,需要对商品进行修改(即使是由您引起更改的商品也会产生更改事件),其次,因为您已经注意,您可以将同一项目重复或重复三次。
约会更糟-每次传入的约会更新都会导致Outlook重新创建约会,从而导致使用新ID并清除自定义属性。