1

我是 Exchange (2007) 开发的新手,所以请多多包涵。:-)。似乎有无数种用于 Exchange 开发的技术——最新的是 Exchange Web 服务——以及相关的托管 API。我需要编写一个程序,如果有必要,可以在 Exchange 服务器上运行,以扫描人们的邮箱,以清除满足各种标准(与本次讨论无关)的邮件。

据我了解,对于 Exchange 2007 和 Exchange 2010,大多数其他技术(WebDav、MAPI、CDO)现在已被弃用。因此,由于这是一个全新的应用程序,我决定使用 Exchange Web 服务托管 API。

我担心每小时可以扫描的项目数量。由于它是基于 Web 服务的,因此涉及到网络跃点。所以我想在与之通信的服务器上运行这个实用程序。 我必须与“集线器”服务器交谈是否正确?. 我正在使用自动发现,无论哪个邮件服务器包含我正在扫描的实际邮件存储,它似乎都解析为“集线器”服务器。

当下拉多个项目时——使用 ExchangeService.FindItems 并指定页面大小为 500——我从我的工作站到集线器服务器的吞吐量非常好。我能够在 47 秒内检索 22,000 封邮件。这似乎是合理的。 然而,事实证明,当以这种方式检索时,并非所有属性都是“绑定”的。某些属性——比如 ToRecipients 和 CcReipients——没有填写。你必须显式绑定它们(单独)——通过调用

Item.Bind(Server, Item.Id)

这是到服务器的单独往返,这会将吞吐量从大约 460 项/秒降低到 3 项/秒——这是不可行的。

所以 - 其他几个问题。有没有办法在调用 FindItems 期间强制绑定缺少的属性?如果做不到这一点,有没有办法一次绑定多个项目?

最后,对于这类工作,我选择 Exchange Web Services 是否正确。我喜欢编程模型的简单性,如果 (a) 更复杂或 (b) 已弃用,我不想转向另一种技术。如果另一种技术能更好地完成这项工作,并且没有被弃用,那么我会在必要时考虑使用它。感谢您的意见和建议。

4

1 回答 1

1

您可以使用该服务在对服务器的一次调用中为许多项目加载许多属性——它正是为您的问题而设计的。不幸的是,托管 API 文档仍然很薄。

results = folder.findItems... (或任何你正在拨打的 find 电话)

service.LoadPropertiesForItems(results, propertySet);

属性集类似于:

PropertySet s = new PropertySet(BasePropertySet.IdOnly, ItemSchema.Subject, customDefinitions);

如果要取回大量记录,请使用各种 xSchema 类加载您希望最小化负载的特定字段。

于 2010-08-11T14:58:04.737 回答