【问题标题】:Exchange Web Service managed, get deleted appointments托管 Exchange Web 服务,获取已删除的约会
【发布时间】:2011-11-17 02:44:15
【问题描述】:

我即将编写一个 ews 应用程序来连接 Exchange 与另一个日历程序。我发生了什么事,我怎么知道,哪些约会在交换时被删除?有没有办法告诉?我在 API 和文档中找不到它。

提前致谢。

【问题讨论】:

    标签: exchangewebservices exchange-server-2007 ews-managed-api


    【解决方案1】:

    根据用户删除约会(或任何项目)的方式,会执行不同的操作:

    • 软删除:该项目被移动到邮箱的回收站。
    • 硬删除:项目被立即删除。

    您可以通过多种方式获取有关已删除项目的信息:

    • 使用 FindItems 调用查询文件夹并在 ItemView 的 Traversal 属性中选择 ItemTraversal.Associated。注意:这需要 Exchange 2010。
    • 一次性使用 SyncFolderItems 并将同步 cookie 存储在某处。稍后,使用之前存储的 cookie 再次执行 SyncFolderItems。 Exchange 现在将为您提供文件夹发生更改的详细列表。
    • 在回收站中查询约会。它们很可能来自用户的默认日历。

    【讨论】:

    • 谢谢你的回答,我真的迷路了:-D
    • 另一个选项是将您拥有的约会数据与交易所拥有的数据进行比较,并删除 EWS 中不存在的行。不过,性能很糟糕。
    【解决方案2】:

    我编写了一个将 EWS 日历约会同步到 Sql 表的服务。

    对于插入/更新更改后的删除,如果数据库中有一行而不是 EWS,我将删除它,因为这意味着它已在 Exchange 中删除。我使用 GUID 来跟踪数据库和交换中的约会。 Exchange web services: why is ItemId not constant? [continued]

    只有几十个约会,性能还不错,我会在更大的数据集上尝试。

    Dim appointmentGuid As New List(Of String)
    For Each appointment In appointments 'appointments is IEnumerable(Of Appointment) from EWS
    Dim guid As String = GetGuidForAppointment(appointment)
    If String.IsNullOrEmpty(guid) Then
        SetGuidForAppointment(appointment)
        guid = GetGuidForAppointment(appointment)
    End If
    appointmentGuid.Add(guid)
    
     'Upsert rows
     ...
    Next
    
    'Delete orphaned rows 
    Using sqlConnection As New SqlConnection(ConnectionString)
    Dim deleteScript As New StringBuilder()
    Using sqlCmd As New SqlCommand("SELECT ID FROM Appointments", sqlConnection)
        Using sqlDataReader As SqlDataReader = sqlCmd.ExecuteReader()
            sqlConnection.Open()
            While sqlDataReader.Read()
                Dim guid As String = sqlDataReader.GetString(0)
                If Not appointmentGuid.Contains(guid) Then
                    deleteScript.AppendFormat("DELETE FROM Appointments WHERE ID = '{0}'; ", guid)
                End If
            End While
        End Using
    End Using
    If deleteScript.Length > 0 Then
        Using sqlCmd As New SqlCommand(deleteScript.ToString(), sqlConnection)
            sqlCmd.ExecuteNonQuery()
        End Using
    End If
    End Using
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      相关资源
      最近更新 更多