RemotePresenceView получает только одно уведомление, после чего больше ничего не происходит

PresenceView создается с конечной точкой приложения, которая подготавливается вручную. Я снабдил его тремя целями, все из которых сообщают, что они "подписаны". Но я получаю только первое уведомление. После этого ничего не происходит. То же самое и с голосованием. Событие NotificationRecieved не срабатывает после первого уведомления. Журнал событий Lync не показывает никаких ошибок и никаких ожиданий.

Моя установка представляет собой виртуальную среду с контроллером домена, сервером Lync и машиной разработчика, которая также действует как пул приложений. Все выглядит нормально.

Ниже приведены некоторые примеры моего кода. Мое решение состоит из двух проектов: небольшого консольного приложения и проекта с кодом lync. Он основан на примере решения SubscribePresenceView из примеров кода UCMA, который прекрасно обновляет состояние присутствия, хотя вместо этого использует конечную точку пользователя.

        public void Run()
    {
        _helper = new Helper(new ConsoleLogger());
        _applicationEndpoint = _helper.CreateApplicationEndpoint();


        var viewSettings = new RemotePresenceViewSettings();
        viewSettings.SubscriptionMode = RemotePresenceViewSubscriptionMode.Default;
        _presenceView = new RemotePresenceView(_applicationEndpoint, viewSettings);

        List<RemotePresentitySubscriptionTarget> targets = new List<RemotePresentitySubscriptionTarget>();
        targets.Add(new RemotePresentitySubscriptionTarget("sip:[email protected]"));
        targets.Add(new RemotePresentitySubscriptionTarget("sip:[email protected]"));
        targets.Add(new RemotePresentitySubscriptionTarget("sip:[email protected]"));

        this.WireUpHandlersForView(_presenceView);

        _presenceView.StartSubscribingToPresentities(targets);
    }

Обработать метод делегата уведомления:

    private void RemotePresenceView_NotificationReceived(object sender, RemotePresentitiesNotificationEventArgs e)
    {
        // A RemotePresentityNotification will contain all the
        // categories for one user; Notifications can contain notifications
        // for multiple users.

        foreach (RemotePresentityNotification notification in e.Notifications)
        {
           Console.WriteLine("\nReceived a Notification for user "+ notification.PresentityUri + ".");

           // If a category on notification is null, the category
           // was not present in the notification. This means there were no
           // changes in that category.



           if (notification.AggregatedPresenceState != null)
           {
               Console.WriteLine("Aggregate State = " + notification.AggregatedPresenceState.Availability + ".");
           }

           if (notification.PersonalNote != null)
           {
               Console.WriteLine("PersonalNote: " + notification.PersonalNote.Message + ".");
           }

           if (notification.ContactCard != null)
           {
               // A ContactCard contains many properties; only display
               // some.
               ContactCard contactCard = notification.ContactCard;
               Console.WriteLine("ContactCard Company: " + contactCard.Company + ".");
               Console.WriteLine("ContactCard DisplayName: " + contactCard.DisplayName + ".");
               Console.WriteLine("ContactCard EmailAddress: " + contactCard.EmailAddress + ".");
           }           
        }
    }

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.


person mupersan82    schedule 16.10.2012    source источник
comment
Привет, добро пожаловать в Stack Overflow! Вы можете попробовать немного переформулировать свой вопрос. В принципе, здесь нет никакого вопроса.   -  person Dennis Haarbrink    schedule 16.10.2012
comment
Я думаю, мой вопрос: почему состояние присутствия не обновляется?   -  person mupersan82    schedule 17.10.2012
comment
Я переписал свое описание проблемы, надеюсь, это поможет.   -  person mupersan82    schedule 17.10.2012


Ответы (2)


Так и не нашел решения, поэтому я пошел дальше и вместо этого использовал UserEndPoint, который отлично работает.

person mupersan82    schedule 23.10.2012

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

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

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

  • Когда вы устанавливаете конечную точку приложения, оно открывает соединение с сервером (я думаю, обычно это порт 5061).
  • Когда вы подписываетесь на RemotePresenceView, он отправляет этот запрос на подписку по этому соединению, и сервер ответит уведомлениями о текущем состоянии всех подписанных Presentities (глупое слово) по тому же соединению, поэтому вы получаете первое уведомление.
  • Для всех последующих уведомлений сервер будет пытаться подключиться обратно к хост-компьютеру конечной точки вашего приложения через порт, который вы определили для конечной точки, и, вероятно, проблема именно в этом.

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

person Grinden    schedule 08.08.2013