Увеличение срока службы для подключения потоковой подписки EWS - PullRequest
10 голосов
/ 16 июня 2011

Используя EWS от Microsoft, мы можем прослушивать почтовый ящик и предпринимать действия при поступлении нового письма. Однако я не могу понять, как избежать тайм-аута соединения.

По Microsoft, вот конструктор для StreamingSubscriptionConnection:

public StreamingSubscriptionConnection (
    ExchangeService service,
    int lifetime
)

В моем приложении я кодировал его следующим образом:

service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
StreamingSubscriptionConnection conn = new StreamingSubscriptionConnection(service, 30);

Другими словами, у меня есть время ожидания (время жизни) установить на 30 минут, потому что это самый высокий уровень, который я смог установить.Как я могу увеличить это?Или как мне заставить эту подписку остаться в живых, даже если между входящими электронными письмами проходит ~ 45 минут?

Ответы [ 3 ]

17 голосов
/ 27 июня 2011

30 минут - жесткий предел. Вы не можете изменить его на более высокое значение.

Чтобы решить эту проблему, подключите обработчик к обработчику OnDisconnected события OnDisconnect экземпляра соединения. Перезапустите подписку оттуда (просто вызовите connection.Open () из этого обработчика).

2 голосов
/ 07 июня 2013

Если кому-то еще интересно, вот как я это делаю.

Я хочу оставить соединение открытым, поэтому я сбрасываю его в обработчике OnDisconnect.

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

Это позволяет мне отписаться от моих подключений в другом месте моего кода (OnNotificationEvent), и когда все подписки были отменены, я могу закрыть соединение.

Вот мой код:

 void connection_OnDisconnect(object sender, SubscriptionErrorEventArgs args)
    {
        var c = (Dictionary<string, StreamingSubscription>)typeof(StreamingSubscriptionConnection).GetField("subscriptions",System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(sender);

        if (c.Count > 0)
        {
            // reopen the connection
            ((StreamingSubscriptionConnection)sender).Open();

            using (var db = new Metrics_DatabaseEntities())
            {
                PushNotificationTest pt = new PushNotificationTest();
                pt.RetObj = "Connection reset";

                db.PushNotificationTests.Add(pt);

                db.SaveChanges();

            }
        }
        else
        {
            using (var db = new Metrics_DatabaseEntities())
            {
                PushNotificationTest pt = new PushNotificationTest();
                pt.RetObj = "Connection closed!";

                db.PushNotificationTests.Add(pt);

                db.SaveChanges();

            }
        }
    }

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

1 голос
/ 29 июня 2011

Если людям интересно, вот небольшая логика, которая была добавлена.

Я добавил это в мой метод запуска:

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

Затем я добавил метод OnDisconnect:

private void OnDisconnect(object sender, SubscriptionErrorEventArgs args)
{
    Start();
}

В конечном счете, это все еще нуждается в улучшении, потому что это просто время ожидания и переподключение каждые полчаса, независимо от активности входящей электронной почты. Я бы предпочел получить что-то, что сбрасывает счетчик каждый раз, когда приходит новое сообщение. Тогда он будет отключаться только пару раз в день вместо 48! Тем не менее, это служит своей цели - держать мою программу прослушивания электронной почты в сети.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...