OnSubscriptionError EWS双重订阅

时间:2014-11-17 08:43:25

标签: exchangewebservices

我正在连接到托管在云上的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();
        }

1 个答案:

答案 0 :(得分:0)

我在OnError函数中显式调用Unsubscribe函数,除非ErrorCodeErrorSubscriptionUnsubscribedErrorSubscriptionNotFound。不确定是否跳过这会导致双重通知,或者甚至为什么他们会进入另一个连接,但是把它扔到那里可能会很好。

我还建议不要在事件处理程序中调用ReConnectAndSubscribe()函数。这可能需要一些时间,并且在处理程序中做得越少越好,但我无法想象这是相关的。设置一个标志以重新进行,并在主线程上进行。

至于弄清楚为什么Exchange这样做,我会说放弃这个任务,特别是如果你在O365上。我的经验是,在这种环境下订阅和连接频繁发生“坏事”,你所能做的就是把它拿出来继续重新连接。