- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们的 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.
特别是with regard to EWS :
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 的绑定(bind)失败,则回退到扩展属性搜索。如果绑定(bind)成功,则根据数据库中的扩展属性检查它以确保它匹配。如果项目不匹配,请在获得项目后更新 ItemId。您是否需要处理 Appointment 对象之外的任何内容,即 session 响应、转发通知等,或者这只与日历有关?
虽然不漂亮,但应该是一个比较合理的妥协。您可能仍然偶尔会进行搜索,但只要用户不决定将约会移动到不同的文件夹或提前计划一些约会,它们就应该很少见,即使这样同步也应该有助于缓解这种情况.如果 Exchange 升级,请准备好重新填充该表。
当然,如果 Microsoft 已经添加了索引其他属性的功能,或者甚至为此目的在 Exchange 搜索中的索引中添加了一两个空白字符串字段,我们就不会遇到这个问题。哎呀,约会和关联对象的 GlobalObjectId 属性的索引会有所帮助,但唉......没有。我不喜欢重新利用现有的索引字段。并非所有这些都适用于约会,而那些往往是用户需要或可编辑的。除非您确切地知道自己在做什么,否则重新调整这些领域的用途可能会在未来产生不可预见的后果。
无论如何,我并不声称自己是 EWS/Exchange 所有事务的专家,所以也许有比这更好的方法。对此持保留态度。
关于c# - 在 Exchange 上使用扩展属性缓慢搜索项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18855079/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!