【问题标题】:Publishing Lync 2010 user presence not showing on the users lync client发布 Lync 2010 用户状态未显示在用户 lync 客户端上
【发布时间】:2012-04-12 14:35:29
【问题描述】:

在受信任的应用程序端点中,我必须根据外部存在提供者发布用户状态,我可以这样做(稍后在外部源变为“空闲”时清除它们是一个不同的问题)

但问题是,如果我为用户 A 发布新状态,这不会反映在用户拥有的 Lync 客户端上,尽管其他人都会收到更新。

此时我正在使用这段 sn-p 代码进行发布:

    user.Endpoint.LocalOwnerPresence.BeginPublishPresence(
        user.categories,
        arBeginPublishPresence =>
        {
            try
            {
                user.Endpoint.PresenceServices.EndUpdatePresenceState(arBeginPublishPresence);
                logger.log("Published presence for {0} with state {1}.", user.SipUserUri, newState.Availability);
            }
            catch (RealTimeException ex)
            {
                logger.log("Failed publishing presence for {0}. {1}", user.SipUserUri, ex);
            }
        },
        null);

user.categories 所在的位置:

            PresenceCategoryWithMetaData stateWithMetaDataForPersonal = new PresenceCategoryWithMetaData(++instanceId, 400, newState);
            PresenceCategoryWithMetaData stateWithMetaDataForWorkgroup = new PresenceCategoryWithMetaData(instanceId, 300, newState);
            PresenceCategoryWithMetaData stateWithMetaDataForColleagues = new PresenceCategoryWithMetaData(instanceId, 200, newState);
            PresenceCategoryWithMetaData stateWithMetaDataForExternal = new PresenceCategoryWithMetaData(instanceId, 100, newState);
            PresenceCategoryWithMetaData stateWithMetaDataForAll = new PresenceCategoryWithMetaData(instanceId, 0, newState);
            if (instanceId >= Int64.MaxValue)
            {
                instanceId = 1;
            }

            stateWithMetaDataForPersonal.ExpiryPolicy = expirypolicy;
            stateWithMetaDataForWorkgroup.ExpiryPolicy = expirypolicy;
            stateWithMetaDataForColleagues.ExpiryPolicy = expirypolicy;
            stateWithMetaDataForExternal.ExpiryPolicy = expirypolicy;
            stateWithMetaDataForAll.ExpiryPolicy = expirypolicy;

            stateWithMetaDataForPersonal.Expires = timeout;
            stateWithMetaDataForWorkgroup.Expires = timeout;
            stateWithMetaDataForColleagues.Expires = timeout;
            stateWithMetaDataForExternal.Expires = timeout;
            stateWithMetaDataForAll.Expires = timeout;

            user.categories =
                new List<PresenceCategoryWithMetaData>()
                        {
                            stateWithMetaDataForPersonal,
                            stateWithMetaDataForWorkgroup,
                            stateWithMetaDataForColleagues,
                            stateWithMetaDataForExternal,
                            stateWithMetaDataForAll
                        };

类别正在地毯式轰炸存在状态,我只是知道我做错了。不可能是这样……乱七八糟的。

请多多包涵,我是 C#、.NET 和 UCMA 的新手,直到一个月前才接触过这些。

【问题讨论】:

    标签: c# lync-2010 ucma user-presence


    【解决方案1】:

    这对我来说似乎是正确的行为。 Lync 将聚合用户登录的所有终结点的状态,以提供单一状态。例如,如果用户在其 PC 上登录 Lync 时将其状态设置为“离开”,并且在其移动客户端上登录到 Lync 时状态设置为“可用”,则所有用户都将看到“可用”的聚合状态 -因为他可以到达端点之一。但是,他的 Lync 客户端仍将“离开”。

    所以我认为同样的事情正在发生在你身上。您的 UCMA 应用程序只是您从中发布状态的另一个端点。您可能正在发布“可用”的存在,但它是来自 UMCA 应用程序中端点的存在,因此它不会影响他登录的任何其他端点,例如Lync 客户端。但是,所有其他用户都会看到聚合的在线状态。

    这更像是一个有根据的猜测,而不是我用代码证明的任何事情。我已经通过 SDK 进行了侦察,但我看不到任何“覆盖”其他端点存在的方法(实际上,这样做强烈感觉像是错误的行为)。

    【讨论】:

    • 原来添加ContainerId 2 好像确实是这样的。
    • 我猜这有点道理——你只需要确保容器 ID 确实映射回你想要的端点——例如如果用户在移动设备和 PC 上登录,您是要同时更改两者,还是只针对 PC,然后您需要了解要更新哪个容器。此外,请记住,如果您这样做并将 Lync 中的用户状态设置为例如忙,没有什么可以阻止他们改变它并覆盖你的改变
    • 我知道。我也尝试订阅状态更新,当发布的状态导致收到的事件导致新的帖子时,它已经咬了我几次......即时日志填充 :) 确实让我担心的那个是状态更新,其中 xml 消息本身返回一个状态,但 aggregatesState 对象为 -1 且“无”
    • 确切地说,我真正想做的是在一个存在体上发布一个活动,例如“电话离线”,用户可以随意更改他们的状态,但保留注意,或者如果电话忙,将实际状态设置为忙,并发送一条消息“例如“电话中”,并将其保持在那里,直到用户不再在电话上说话。我可以推送这些,虽然我不确定我做得对。一旦手机进入不需要自定义消息的空闲状态,我无法清除消息表明我不是。
    • 我发现了我的错误,我在每次状态更新时都使用了一个新的 instanceId,因此调用 BeginDeletePresence 没有任何效果,因为我在 Lync 系统中仍然有大量旧状态。
    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多