手头的问题
我们的 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 将一些评论与搜索文件夹和受限视图联系起来,但我不确定这些是否适用于我们的情况。
将视图应用于文件夹的操作会在存储中创建搜索文件夹。创建搜索文件夹时,会对其进行缓存以供以后使用。如果用户尝试创建已经存在的搜索文件夹,则使用缓存的搜索文件夹。这使得未来的观看变得相当快。默认情况下,Exchange 不会无限期地缓存所有搜索文件夹。
特别是关于 EWS:
同样重要的是要知道第一次发出 Exchange 存储搜索查询时,它会运行得非常缓慢并且可能会超时,而在以后的运行中它会毫无问题地响应。这是由执行存储搜索时在 Exchange 服务器上发生的后端进程引起的。
他们建议为不变的、非动态的查询创建搜索文件夹,这在我们的案例中似乎不合适,因为每个约会的查询都不同。
如果应用程序需要具有一组固定不变参数的特定查询,您可以使用搜索文件夹。[...] 搜索文件夹仅对不变的、非动态的查询有用。
我们需要的本质上是在属性上创建一个“索引” - 用数据库术语 - 确保对该特定属性的所有搜索都是快速的,无论时间或频率如何。
是否可以“索引”此属性?可以在客户端或服务器端配置任何东西来消除这个初始延迟吗?