我正在连接到托管在云上的Exchange 2013,并使用EWS(Exchange Web服务API)注册流式通知。问题是,在任何随机时间,订阅抛出错误,我正在处理OnSubscriptionError事件。在这里,我将删除所有订阅并关闭连接并再次连接。
设置了我的连接和订阅后,应用程序开始接收多个事件。它看起来像双流订阅连接的情况。
触发OnSubscriptionError时从点重新建立连接的最佳方法是什么? 有没有办法看到导致OnSubscriptionError事件在Exchange端触发的原因?
static void OnError(object sender, SubscriptionErrorEventArgs args)
{
// Handle error conditions.
Exception e = args.Exception;
CustomLogger.WriteErrorLog(String.Format("In OnError: " + Environment.NewLine + " Message:{0} " + Environment.NewLine + "Exception Message:{1} " + Environment.NewLine + "Inner Exception:{2} " + Environment.NewLine + "Source:{3} " + Environment.NewLine + "Stack Trace{4}",
ErrorMessages.GeneralError, e.Message, e.InnerException, e.Source, e.StackTrace), drawLines: true);
StreamingSubscriptionConnection connection = null;
if (args.Subscription != null)
{
CustomLogger.WriteErrorLog(Messages.UnSubscribeToNotifications);
try
{
connection = (StreamingSubscriptionConnection)sender;
connection.RemoveSubscription(args.Subscription);
}
catch
{
}
CustomLogger.WriteErrorLog(Messages.UnSubscribedToNotifications);
}
if (connection != null && connection.IsOpen) connection.Close();
ReConnectAndSubscribe();
}
答案 0 :(得分:0)
我在OnError函数中显式调用Unsubscribe函数,除非ErrorCode
是ErrorSubscriptionUnsubscribed
或ErrorSubscriptionNotFound
。不确定是否跳过这会导致双重通知,或者甚至为什么他们会进入另一个连接,但是把它扔到那里可能会很好。
我还建议不要在事件处理程序中调用ReConnectAndSubscribe()
函数。这可能需要一些时间,并且在处理程序中做得越少越好,但我无法想象这是相关的。设置一个标志以重新进行,并在主线程上进行。
至于弄清楚为什么Exchange这样做,我会说放弃这个任务,特别是如果你在O365上。我的经验是,在这种环境下订阅和连接频繁发生“坏事”,你所能做的就是把它拿出来继续重新连接。