在EWS中使用StreamingSubscriptionConnection时自动重新连接

时间:2012-08-17 15:48:01

标签: c# exchangewebservices ews-managed-api

我创建了一个使用EWS托管dll观看收件箱的小应用。

当我创建StreamingSubscriptionConnection时,我会在1分钟内断开连接。

然后在on disconnect事件处理程序中,我睡眠45秒并重新连接。

如果在45秒睡眠期间发送任何内容,它最初似乎就像醒来一样正确地发射了NotificationEventDelegate。但是,经过一些测试后,当多个电子邮件到达时,它似乎会多次触发相同的电子邮件。

如果我不睡觉,那么我就没有这个问题。所以我的问题是,为什么NotificationEventDelegate在重新连接时无法正常运行,并且立即重新连接是否存在问题?

我的代码如下,

private MailDirectorServer()
{
    _isRunning = false;

    ExchangeService _service = new ExchangeService()
    {
        Credentials = new WebCredentials(userName, password),
        Url = new Uri(uriAddress)
    };

    _connection = 
        new StreamingSubscriptionConnection(_service, 1);

    // set up subscriptions here.
    _connection.OnNotificationEvent +=
                new StreamingSubscriptionConnection.NotificationEventDelegate(OnNewMail);

    _connection.OnDisconnect +=
        new StreamingSubscriptionConnection.SubscriptionErrorDelegate(OnDisconnect);

    _connection.Open();
    _isRunning = true;
}

private void OnDisconnect(object sender, SubscriptionErrorEventArgs args)
{
    while (true)
    {
        if (_isRunning)
        {
            //_logger.Debug("Sleeping for 45 seconds");
            //Thread.Sleep(new TimeSpan(0, 0, 45));
            _connection.Open();
            _logger.Info("Connection Re Opened");
            break;
        }
        else
        {
            _logger.Info("Closing Down");
            break;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

删除Sleep来电 - 只需立即重新连接(connection.Open)。见related SO post。微软也recommends this process of automatic reconnect in their forums

我还会将断开间隔增加到 30分钟,以避免连续打开和关闭连接。只需一分钟断开连接,您也可以使用Pull Subscriptions

当流式订阅出现错误时,您还应该处理OnSubscriptionError以进行捕获。