Наличие/состояние контакта в Lync 2013 SDK показывает присутствие неизвестно до ручного поиска клиента

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

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

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

Есть ли метод Refresh(), который мне где-то не хватает? Или есть способ заставить его найти это? Вот мои методы поиска:

   public Contact GetContact(string emailAddress)
    {
        Contact user;
        lock (ContactLookupCache)
        {
            while (!ContactLookupCache.TryGetValue(emailAddress.ToLower(), out user))
            {
                lock (Client)
                {
                    Client.ContactManager.BeginSearch(emailAddress, this.HandleContactLookup, null);
                }
                Monitor.Wait(ContactLookupCache);
            }
        }
        return user;
    }

 public string GetContactPresenceState(Contact contact)
        {            
            string presenceStatus = contact.GetContactInformation(ContactInformationType.Activity).ToString();
            // see if the status is either "Presence unknown" or "Updating..."
            if (IsUnknownPresenceState(presenceStatus))
            {
                lock (contact)
                {
                    //bug?? This event seems to only fire sometimes when you search on the app for contact details
                    contact.ContactInformationChanged += (object sender, ContactInformationChangedEventArgs e) =>
                    {
                        if (e.ChangedContactInformation.Contains(ContactInformationType.Activity))
                        {
                            lock (contact)
                            {
                                presenceStatus = contact.GetContactInformation(ContactInformationType.Activity).ToString();
                                if(!IsUnknownPresenceState(presenceStatus))
                                    Monitor.PulseAll(contact);
                            }
                        }
                    };
                    Monitor.Wait(contact);
                }
            }
            return presenceStatus;
        }

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


person ChrisG    schedule 24.07.2014    source источник


Ответы (1)


Не могли бы вы убедиться, что код работает нормально для всех контактов в вашем списке контактов, и только те, которые не перечислены, где события изменения присутствия не вызываются правильно?

Это имеет смысл для меня, учитывая, что вы используете клиентский SDK, который будет сообщать вам только о событиях, в которых заинтересован клиент. Например, было бы довольно интенсивно, если бы все 85 000 клиентов получали изменения присутствия для других 85 000 клиентов в компании.

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

В противном случае вы можете захотеть изучить UCMA SDK, который лучше подходит для централизованных служб, чем клиентский SDK.

person Paul Hodgson    schedule 24.07.2014
comment
Спасибо! Вы правы, событие вызывается только для контактов в списке. Теперь у меня есть код, который добавляет в список контактов, прежде чем я попытаюсь получить информацию о присутствии. Кроме того, я собираюсь переписать его в UCMA SDK (поскольку это действительно имеет больше смысла) - person ChrisG; 29.07.2014