我正在编写一个 C# 控制台应用程序来连接到多个 Exchange 邮箱(主要是 Microsoft 365,但也有一些本地邮箱),并在新消息到达时接收通知。我正在使用 EWS API 来执行此操作。
一切正常:我为每个邮箱创建一个 EWS 连接
_exchangeService= new ExchangeService(ExchangeVersion.Exchange2013_SP1)
{
Url = new Uri($"{server.ServerAddress}/EWS/Exchange.asmx")
};
..然后订阅
NewMail
通知:
_subscription = _exchangeService.SubscribeToStreamingNotifications(new FolderId[] { WellKnownFolderName.Inbox }, EventType.NewMail);
var connection = new StreamingSubscriptionConnection(_exchangeService, 25);
connection.AddSubscription(_subscription);
connection.OnNotificationEvent += Connection_OnNotificationEvent;
connection.OnDisconnect += Connection_OnDisconnect;
connection.OnSubscriptionError += Connection_OnSubscriptionError;
connection.Open();
这非常有效 - 收到通知,所有内容都按单个测试邮箱的预期运行。但是,如果我将此代码放入迭代我需要监视的所有邮箱的代码中,则在代码停止之前我只能获得两个订阅。
没有异常,没有错误迹象,但代码停在:
_subscription = _exchangeService.SubscribeToStreamingNotifications(new FolderId[] { WellKnownFolderName.Inbox }, EventType.NewMail);
我已经离开它几分钟了,但它似乎没有继续前进。它不特定于任何一个特定邮箱或 Exchange 帐户,或本地与 365,无论我以哪种顺序连接,我都只能获得两个订阅。如果我不创建订阅,而是执行其他 EWS API 操作(例如
FindItems
),那么这些工作正常 - 只有订阅似乎受到影响。
这不仅影响我的开发环境(Windows 11/ARM64) - 我已将其部署到生产服务器(Windows Server 2019,x64),并且它在那里执行相同的操作。这不是“已达到最大订阅限制”错误 - 会引发明显的异常,而此问题会导致代码等待。 为了查看代码是否发出 EWS 请求,我在运行
Fiddler的情况下运行了代码(在“流”模式下) - 令人难以置信的是,一切都工作正常!订阅已创建,事件已接收,一切都按预期进行。 我不明白订阅的限制从何而来,也不明白为什么运行 Fiddler 可以解决问题。我假设 Fiddler 正在将自身安装为系统代理,并且以某种方式影响事物,但它显然不是生产服务器的永久解决方案。