Куда идет моя потоковая подписка? - PullRequest
6 голосов
/ 06 мая 2011

Я использую Microsoft Exchange Web Services 1.1 SDK и использую потоковое соединение для подписки на уведомления о новой почте.Все отлично работает для получения уведомлений, но время от времени я получаю ошибки о том, что Exchange не может найти мою подписку.

Ниже приведен код, который я использую для инициализации своей подписки, и события, которые я использую.

public void Subscribe()
{
    var locateMailbox = new Mailbox
                            {
                                Address = "myemail"
                            };
    var folderId = new FolderId(WellKnownFolderName.Inbox, locateMailbox);
    var foldersToWatch = new[] {folderId};
    StreamingSubscription streamingSubscription =
        _exchangeService.SubscribeToStreamingNotifications(foldersToWatch, EventType.NewMail);
    // Timeout is set at 1 minute intentionally
    var streamingConnection = new StreamingSubscriptionConnection(_exchangeService, 1);

    streamingConnection.AddSubscription(streamingSubscription);

    streamingConnection.OnSubscriptionError += ResolveError;
    streamingConnection.OnDisconnect += Reconnect;

    streamingConnection.Open();
}

public void Reconnect(object sender, SubscriptionErrorEventArgs disconnectEventArgs)
{
    if (!((StreamingSubscriptionConnection)sender).IsOpen)
        ((StreamingSubscriptionConnection)sender).Open();
}

public void ResolveError(object sender, SubscriptionErrorEventArgs errorEventArgs)
{
    var streamingSubscriptionConnection =
        (StreamingSubscriptionConnection) sender;
    if (!streamingSubscriptionConnection.IsOpen)
        streamingSubscriptionConnection.Open();
}

ServiceLocalException - You must add at least one subscription to this connection before it can be opened.

Это исключение говорит само за себя, и я знаю, что могу просто создать еще одну подписку внутри Reconnect().Я надеюсь, что кто-то может помочь мне понять, куда идет подписка.Я не могу представить, что такой продукт, как Exchange 2010, просто потеряет мою подписку.Кроме того, я не могу точно указать ошибку.Иногда я могу поддерживать свою подписку активной в течение 10 минут, а иногда я получаю сообщение об ошибке, что моя подписка недействительна через 2-3 минуты.

Для чего я использую Exchange 2010 SP1.

Ответы [ 2 ]

7 голосов
/ 09 мая 2011

Если посмотреть на источник в Reflector, то похоже, что только два способа удалить подписку (кроме удаления StreamingSubscriptionConnection, это вызвать Remove, что, как я полагаю, вы не делаете, или посредством подписки). возвращая код ошибки, отличный от ServiceError.ErrorMissedNotificationEvents. Вы можете проверить ошибку, посмотрев на errorEventArgs.Exception в обработчике ResolveError. Если это экземпляр ServiceResponseException, приведите его к этому типу и получите свойство ErrorCode После срабатывания события OnSubscriptionError подписка автоматически удаляется.

Получение кода ошибки может помочь вам отследить, почему это происходит, но даже если вы не можете это исправить, вы можете определить, когда будет удалена подписка, и асинхронно добавить другую подписку в этом случае.

1 голос
/ 02 сентября 2015

Я знаю, что об этом спрашивали давным-давно, но я подумал, что напишу, как я обхожу ошибку (не могу найти ничего, что объясняет ПОЧЕМУ это происходит).Кстати, также используя Office 2010 sp1.

Вы можете использовать метод Count () от отправителя, чтобы проверить, есть ли у вас активная подписка;

private static void onDisconnect(object sender, SubscriptionErrorEventArgs args)
    {

        StreamingSubscriptionConnection renew = (StreamingSubscriptionConnection)sender;
        if(renew.CurrentSubscriptions.Count() > 0){ //if subscription exists reopen as normal
            renew.Open(); 
        }
        else
        {
            //recreate the whole connection
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...