Куда уходит моя подписка на стриминг?

Я использую 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.


person Mike    schedule 06.05.2011    source источник


Ответы (2)


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

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

person Mike Dour    schedule 08.05.2011
comment
Я сделал, как вы предложили, и я получаю код ошибки ErrorSubscriptionNotFound. Не уверен, почему, потому что, если я углублюсь в аргумент sender, я увижу, что там есть подписка. - person Mike; 09.05.2011
comment
Код ошибки — это ошибка, пришедшая с сервера. Когда вы развернетесь и увидите, что подписка все еще существует, вы находитесь на клиенте. Это сервер, который не может найти подписку. Я предполагаю, что сервер отменил подписку через минуту или около того, потому что вы дали тайм-аут только в одну минуту. Попробуйте увеличить тайм-аут и посмотрите, возникает ли проблема. Почему вы намеренно использовали тайм-аут в одну минуту? - person Mike Dour; 09.05.2011
comment
Я установил тайм-аут на одну минуту, потому что я получал ту же ошибку с 30-минутным тайм-аутом. Вместо того, чтобы ждать несколько наборов по 30 минут, чтобы найти ошибку, я хотел видеть ошибки быстрее. Но теперь, когда я думаю об этом, я все еще должен защищаться от кода, чтобы постоянно поддерживать активную подписку. Вы никогда не знаете, когда у сервера будет сбой. Спасибо. - person Mike; 09.05.2011
comment
Похоже, мне нужно подождать 6 часов, прежде чем наградить награду. - person Mike; 09.05.2011
comment
Не беспокойся. Рад, что смог помочь. - person Mike Dour; 09.05.2011

Я знаю, что это было задано давно, но я решил опубликовать, как я обхожу ошибку (не могу найти ничего, что объясняет, ПОЧЕМУ это происходит). Кстати, тоже использую 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
        }
    }
person Abu Hajar    schedule 02.09.2015