如何在使用PullSubscription时确定EWS中日历项的修订版

时间:2015-07-21 18:14:52

标签: exchange-server exchangewebservices

我正在尝试与Exchange日历进行一些同步工作。我想让另一个外部日历与Exchange保持同步。目前,当其他应用程序在Exchange中触发某种创建或更新时,该更改将被发送回另一个日历,从而创建无限循环。

我曾希望在绑定Appointment项时使用AppointmentSequenceNumber属性,但无论更新多少次,它总是具有值0。我在我的PropertySet中包含了AppointmentSequenceNumber。

如果有人知道如何捕获这些更新并阻止它们被发回,那将非常有用。

谢谢。

        PropertySet pSet = new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.Subject, ItemSchema.Body, AppointmentSchema.Start, AppointmentSchema.End,AppointmentSchema.ArchiveTag, AppointmentSchema.InstanceKey, AppointmentSchema.AppointmentSequenceNumber);
        ChangeCollection<ItemChange> changes = null;
        .....
        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013)
        {
            Url = new Uri(exInfo.ServiceURL),
            Credentials = new WebCredentials(exInfo.UserName, exInfo.Password)
        };

        //Pull Subscription Info
        Microsoft.Exchange.WebServices.Data.PullSubscription sub = service.SubscribeToPullNotifications(
            new FolderId[] { WellKnownFolderName.Calendar }, 30, "",
            EventType.Created, EventType.Modified, EventType.Deleted);
        syncState = exInfo.SyncState;
        //Pull Changes
        while (!syncComplete )//&& Count < MaxItems)
        {
            changes = service.SyncFolderItems(new FolderId(WellKnownFolderName.Calendar),
            PropertySet.FirstClassProperties, null, 100, SyncFolderItemsScope.NormalItems, syncState);

        foreach (ItemChange change in changes)
        {
            if (change.ChangeType != ChangeType.Delete) { eventItem = Appointment.Bind(service, change.ItemId, pSet); }
            switch (change.ChangeType)
            {
                case ChangeType.Update:
                   ...
                    break;
                case ChangeType.Create:
                    ...
                    break;
                case ChangeType.Delete:
                   ...
                    break;
            }    
            Count++;           
        }            
        syncState = changes.SyncState;
        syncComplete = !changes.MoreChangesAvailable;
        }...

1 个答案:

答案 0 :(得分:1)

AppointmentSequenceNumber仅对会议有效;在正常约会时,它没有被使用。

  

我希望在绑定约会项

时使用AppointmentSequenceNumber属性

即使它正在递增,它也不会起作用。 Exchange将始终为您提供当前版本,并且Bind中唯一有效的内容是约会的EWSId(或重复序列)。

  

如果有人知道如何捕获这些更新并阻止它们被发回,那将非常有用。

同步很复杂但是(从通知的角度来看)如果您在Exchange中修改项目,它将触发通知并且项目的ChangeKey属性将更新(quote):

&#34;在Exchange中处理项目时,要记住的另一个值是ChangeKey属性。除了项目ID之外,该值还用于跟踪项目的状态。每次更改项目时,都会生成一个新的更改密钥。例如,执行UpdateItem操作时,可以使用ChangeKey属性让服务器知道您的更新正在应用于项目的最新版本。如果其他应用程序对您要更新的项目进行了更改,则更改密钥将不匹配,您将无法执行更新。&#34;