我们的C#Windows应用程序使用EWS Managed API 2.0在用户的日历中创建约会.每个约会都有一个具有独特价值的扩展属性.它稍后使用FindItems
和ItemView
找到约会.
用户在第一次执行此搜索时会遇到严重延迟.后续响应时间完全可以接受.
(“第一次”在这里有点模糊,因为用户可能会在当天晚些时候再次遇到延迟)
// locate ID of appointment where extended property value equals 1234: var filter = new Ews.SearchFilter.IsEqualTo(extendedPropertyDefinition,1234); var view = new ItemView(1,0); view.PropertySet = BasePropertySet.IdOnly; var folder = new FolderId(WellKnownFolderName.Calendar,new MailBox("...")); var result = service.FindItems(folder,filter,view);
远程服务器是Exchange Server 2007 SP1.
研究
MSDN ties some comments to search folders and restricted views,但我不确定这些是否适用于我们的情况.
The act of applying a view to a folder creates search folders in the
store. When a search folder is created,it is cached for later use. If
a user tries to create a search folder which already exists,the
cached search folder is used. This allows future viewings to be fairly
quick. By default,Exchange does not cache all search folders
indefinitely.
It is also important to be aware of the fact that the first time an
Exchange store search query is issued,it will run very slowly and
possibly time out,whereas on future runs it will respond without
issue. This is caused by back-end processes that occur on the Exchange
server when a store search is performed.
他们建议为非变化的非动态查询创建搜索文件夹,这在我们的案例中似乎不合适,因为每个约会的查询都不同.
If an application requires a specific query that has a fixed set of
nonchanging parameters,you can use search folders. […] search
folders are useful only for nonchanging,nondynamic queries.
我们需要的是在本质上创建一个“索引” – 在数据库中 – 在属性上,确保所有对这个特定属性的搜索都是快速的,无论时间或频率.
解决方法
您无法为尚未由Exchange编制索引的属性创建索引.如果约会数量增长得足够高,则为每个文件创建一个搜索文件夹是不可行的.单个文件夹上的搜索文件夹太多会导致进一步的问题,因为当将新项目添加到文件夹时,它们都需要更新.这是我的理解,至少.此外,Exchange 2007每个父文件夹限制为11个动态搜索文件夹,因此根据约会数量和访问频率,它可能更不可行.使用现有的索引属性可能不可行,因为这些属性可能会被应用程序外部的用户更改.如果您有某种方法可以确保您创建的约会只能从您的应用程序访问或更改,那么这是一个不同的故事.
数据库表是一个很好的方法,但有一些人可能会看到一个潜在的障碍,直到为时已晚. ItemId是链接到扩展属性的明显选择,但ItemId不是常量.这是一个基于其他几个的计算属性.如果项目被移动到另一个文件夹,它可能会改变,它也可能随着安装服务包或给予足够的时间通过而改变,或者我听说过.我至少可以确认第一个. ItemId不适用于长期存储,至少没有额外的检查.您可以存储ItemId和扩展属性.如果使用ItemId的绑定失败,则回退到扩展属性搜索.如果绑定成功,则根据数据库中的扩展属性进行检查,以确保它匹配.如果项目不匹配,请更新ItemId.您是否需要处理Appointment对象之外的任何事情,即会议响应,转发通知等,或者这仅与日历有关?
它不漂亮,但应该是一个合理的妥协.您可能仍然偶尔进行搜索,但只要用户不决定将约会移动到不同的文件夹或提前计划某些约会方式,它们就应该很少,即使这样,同步也应该有助于缓解这种情况. .如果有升级到Exchange,请准备好重新填充该表.
当然,如果Microsoft已经添加了索引其他属性的功能,或者甚至在Exchange搜索中为索引添加了一个或两个空字符串字段,我们就不会遇到此问题.哎呀,关于约会和关联对象的GlobalObjectId属性的索引会有所帮助,但是唉…没有.我不喜欢重新利用现有的索引字段.并非所有这些都适用于约会,而且这些约会往往是用户要求或可编辑的.除非你确切知道自己在做什么,否则重新利用这些领域可能会产生不可预见的后果.
无论如何,我并不声称自己是EWS / Exchange所有事务的专家,所以也许有更好的方法.拿一粒盐.