我们正在使用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,但我们正在创建两个完全并行的实例,其中没有其他线程中的对象被更改。
我们还发现,如果代码在两个独立的进程中运行而不是线程,则错误消失。
我们的理论是:
这是实现目标的正确方法吗?在视频中:
Exchange Web Services Affinity and Throttling分钟47:00
他们讨论了一个流程架构,其中订阅在多个流程中进行管理,邮箱访问在一个单独的流程中进行管理。发言者声明这是一种负载平衡策略,而不是使用要求。
任何帮助都将不胜感激。
更新:
我们发现,如果两个用户同时运行两个相同的电子邮件帐户,则可能会损坏帐户。
用户1:运行帐户1,帐户2
用户2:运行帐户1,帐户2
现在,两个用户都遇到同一帐户的超时。
答案 0 :(得分:1)
这是一个简单的疏忽。
ServicePointManager.MaxServicePoints = 100
解决了这个问题。