在线程

时间:2016-04-20 17:18:14

标签: office365 exchangewebservices ews-managed-api

我们正在使用EWS Managed API 2.2来检测Office365中托管的多个电子邮件帐户中何时收到新邮件。我们已经调整了这个示例程序。

Using Streaming Notifications with Exchange 2010

这个Windows命令行应用程序基本上会联系Exchange服务器并等待新邮件到达。这是使用单个ExchangeService实例完成的。要获取通知,我们使用StreamingSubscription对象来执行挂起的HTTP Get。

示例程序效果很好,直到我们尝试连接到多个帐户。每个实例都在自己的Thread中,有两个不同的Exchange帐户,两个ExchangeService和两个StreamingSubscription,完全相同的代码会抛出错误。

错误会在不同的位置引发,但现在让我们关注这个错误。

在StreamingSubscription OnNotificationEvent回调中,此代码将抛出“操作已超时”。

ExchangeService.SyncFolderItems(folderId,PropertySet.IdOnly,null,5,SyncFolderItemsScope.NormalItems, State);

如果我们发现此错误并在后续调用中忽略它,我们会看到以下错误:

  • “无法检索此订阅的事件。必须重新创建订阅。,无法读取事件”

  • “Microsoft.Exchange.WebServices.Data.ServiceLocalException:您必须先为此连接添加至少一个订阅才能打开”

现在我们知道EWS库不是THREAD SAFE,但我们正在创建两个完全并行的实例,其中没有其他线程中的对象被更改。

我们还发现,如果代码在两个独立的进程中运行而不是线程,则错误消失。

我们的理论是:

  • 简单错误或在StreamingSubscription中使用静态?
  • 可能会以某种方式覆盖ExchangeService Affinity cookie,因此有关第二个线程正在重用CAS服务器中哪个插槽的信息吗?

这是实现目标的正确方法吗?在视频中:

Exchange Web Services Affinity and Throttling分钟47:00

他们讨论了一个流程架构,其中订阅在多个流程中进行管理,邮箱访问在一个单独的流程中进行管理。发言者声明这是一种负载平衡策略,而不是使用要求。

任何帮助都将不胜感激。

更新:

我们发现,如果两个用户同时运行两个相同的电子邮件帐户,则可能会损坏帐户。

用户1:运行帐户1,帐户2

用户2:运行帐户1,帐户2

现在,两个用户都遇到同一帐户的超时。

1 个答案:

答案 0 :(得分:1)

这是一个简单的疏忽。

ServicePointManager.MaxServicePoints = 100

解决了这个问题。

相关问题