Автоматическое повторное подключение при использовании StreamingSubscriptionConnection в EWS

Я создал небольшое приложение, которое просматривает папку "Входящие" с помощью управляемой DLL EWS.

Когда я создаю StreamingSubscriptionConnection, я прохожу 1-минутное отключение.

Затем в обработчике событий при отключении я сплю 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;
        }
    }
}

person priehl    schedule 17.08.2012    source источник


Ответы (1)


Удалите вызов Sleep — просто сразу переподключитесь (connection.Open). См. соответствующий пост SO. Microsoft также рекомендует этот процесс автоматического повторного подключения на своих форумах.

Я бы также увеличил интервал отключения до 30 минут, чтобы избежать постоянного открытия и закрытия соединения. При отключении в течение одной минуты вы также можете использовать Подписки по запросу.

Вы также должны обрабатывать OnSubscriptionError для отслеживания ошибок в подписке на потоковую передачу.

person SliverNinja - MSFT    schedule 23.08.2012
comment
очень круто, спасибо за помощь! Я обрабатываю OnSubscriptionError и иногда получаю Microsoft.Exchange.WebServices.Data.ServiceResponseException: указанная подписка не найдена. Вы когда-нибудь слышали о таком? - person priehl; 23.08.2012