首页 > 解决方案 > EWS 中的复制操作和扩展属性的问题

问题描述

我的任务是通过服务双向同步两个邮箱中的联系人文件夹。请多多包涵,因为这是我第一次在 C# 中使用 EWS。

为了唯一标识项目并跟踪同步更改,我使用SyncFolderHierarchy()子文件夹和SyncFolderItems()每个子文件夹中的项目,同时跟踪同步状态。

由于文件夹/项目 ID 依赖于邮箱、初始同步以及创建操作,我通过扩展属性标记同步项目Item.SetExtendedProperty()

这非常有效,但我遇到了一个警告。

当用户在 Outlook 中复制和粘贴文件夹或联系人时,它还会复制唯一 ID(扩展属性),使其不再唯一。在这种情况下,我现在在邮箱中有两个具有相同“唯一”ID 的项目,现在该项目有一个模棱两可的匹配项。

基本上:

  1. SyncFolderItems()被调用,并保存同步状态
  2. 如果项目没有唯一 ID,则使用唯一 ID 进行标记
  3. 用户复制并粘贴项目
  4. SyncFolderItems()被调用(具有先前的同步状态),返回Create用户复制项目的事件
  5. 创建的项目已经有一个唯一的 ID

现在,有人可能会争辩说只是在创建事件中覆盖项目的唯一 ID。

但是,这会导致以下问题:

当我将邮箱 A 中的新项目同步到邮箱 B 时,我还创建了一个项目。现在调用SyncFolderItems()邮箱 A 后,我还会为我自己的项目检索一个 Create 事件,在这种情况下,它已经合法地分配了一个不能被覆盖的唯一 ID。

我基本上看到两个选项:

有没有人对如何以不同的方式处理这个问题或实施任何一个选项有任何建议?

标签: c#exchangewebservicesextended-properties

解决方案


Exchange id 也应该是您的唯一 ID。将您的 id 保留在项目本身上确实不值得 - 首先,这需要修改该项目(即使是您导致更改也会生成更改事件),其次,因为您已经请注意,您最终可能会得到同一项目的重复或三次重复。

约会更糟糕 - 每个传入的约会更新都会导致 Outlook 重新创建约会,从而导致使用新的 id 并清除您的自定义属性。


推荐阅读