【问题标题】:EWS Managed Api - Retrieve calendar items only onceEWS 托管 Api - 仅检索一次日历项目
【发布时间】:2015-11-10 01:27:35
【问题描述】:

我有一个 Windows 服务可以从 Exchange 读取日历项目,并将它们存储在我的应用程序的数据库中以针对每个用户。 现在我想知道在 Exchange 上标记项目以使其在存储后不会在下一次服务运行中检索的最佳方法是什么?

我尝试向日历项添加扩展属性并设置它的值,然后每次都根据它的值进行搜索:

DateTime startDate = DateTime.Now;
DateTime endDate = startDate.AddDays(60);
const int NUM_APPTS = 60;    
// Set the start and end time and number of appointments to retrieve.
CalendarView cView = new CalendarView(startDate, endDate, NUM_APPTS);

Guid myPropertyId = new Guid("{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}");
ExtendedPropertyDefinition myExtendedProperty = new ExtendedPropertyDefinition(myPropertyId, "SyncFlag", MapiPropertyType.Boolean);

// Limit the properties returned to the appointment's subject, start time, end time and the extended property.
 cView.PropertySet = new PropertySet(AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End, AppointmentSchema.Location, myExtendedProperty);

// Retrieve a collection of appointments by using the calendar view.
List<SearchFilter> searchFilterCollection = new List<SearchFilter>();
searchFilterCollection.Add(new SearchFilter.IsEqualTo(AppointmentSchema.Start, DateTime.Now));
searchFilterCollection.Add(new SearchFilter.IsEqualTo(AppointmentSchema.End, DateTime.Now.AddDays(60)));

searchFilterCollection.Add(new SearchFilter.IsNotEqualTo(myExtendedProperty, true)); //Do not fetch already marked calendar items

SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, searchFilterCollection);

FindItemsResults<Item> appointments = service.FindItems(WellKnownFolderName.Calendar, searchFilter, cView);

使用此代码搜索日历项目会引发此异常:

不能为 CalendarView 指定限制和排序顺序。

我也不确定这是否是最好的方法。有什么想法吗?

谢谢

【问题讨论】:

    标签: c# exchange-server exchangewebservices ews-managed-api outlook-calendar


    【解决方案1】:

    一种方法是使用SyncFolderItems 方法。它将返回自上次调用以来更改的项目。您所要做的就是在每次调用之间保存一个同步“cookie”。

    您还应该过滤掉自上次通话后创建的约会项目。

    下面的代码 sn-p 应该可以解决问题。

    static private void GetChangedItems()
    {
        // Path to cookie
        string syncStateFileName = @"c:\temp\ewssyncstate.txt";
    
        try
        {
            var service = GetServiceAP();
            bool moreChangesAvailable = false;
    
            do
            {
                string syncState = null;
    
    
                if (File.Exists(syncStateFileName))
                {
                    // Read cookie
                    syncState = File.ReadAllText(syncStateFileName);
                }
    
                ChangeCollection<ItemChange> icc = service.SyncFolderItems(new FolderId(WellKnownFolderName.Calendar), PropertySet.FirstClassProperties, null, 10, SyncFolderItemsScope.NormalItems, syncState);
    
                if (icc.Count == 0)
                {
                    Console.WriteLine("There are no item changes to synchronize.");
                }
                else
                {
                    syncState = icc.SyncState;
    
                    // Save cookie
                    File.WriteAllText(syncStateFileName, syncState);
    
                    moreChangesAvailable = icc.MoreChangesAvailable;
    
                    // Only get appointments that were created since last call
                    var createdItems = icc
                        .Where(i => i.ChangeType == ChangeType.Create)
                        .Select(i => i.Item as Appointment)
                        ;
    
                    if (createdItems.Any())
                    {
                        service.LoadPropertiesForItems(createdItems, PropertySet.FirstClassProperties);
    
                        foreach (Appointment appointment in createdItems)
                        {
                            Console.WriteLine(appointment.Subject);
                        }
                    }
                }
            }
            while (moreChangesAvailable);
    
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 2013-10-24
      • 2021-07-15
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多