Lync 用户终结点向用户联机显示,但无法调用



我有一个基于Lync 2013的应用程序,它是:

  1. 连接到UserEndpoint(以下简称呼叫中心)根据bla-bla-bla业务逻辑将呼叫重定向到呼叫中心
  2. 有时,用户会在其标准Lync 2013客户端中将呼叫中心视为联机,但如果该用户尝试使用呼叫中心启动IM呼叫,则用户会收到消息"由于呼叫中心不可用或脱机,我们无法发送此消息"

我还无法确定导致这种情况的过程,但如果这种情况发生在一个用户身上,那么所有其他用户在尝试呼叫呼叫中心时都会遇到同样的问题。我恢复呼叫中心的唯一方法是重新启动我的应用程序。然后恢复与呼叫中心的定期交互,不会出现任何问题。

如果呼叫中心确实"不可用或离线",那么为什么它的存在显示为"在线"?是否需要每隔一段时间更新/保持呼叫中心的连接?

为了参考,我这样连接呼叫中心:

UserEndpointSettings settings = new UserEndpointSettings(userURI, _ProxyHost, _ProxyPort);
settings.AutomaticPresencePublicationEnabled = true;
settings.Presence.UserPresenceState = PresenceState.UserAvailable;
_userEndpoint = new UserEndpoint(_Platform.CollabPlatform, settings);
_userEndpoint.BeginEstablish(res =>
{
    try
    {
        _userEndpoint.EndEstablish(res);
        _userEndpoint.StateChanged += new EventHandler<LocalEndpointStateChangedEventArgs>(_userEndpoint_StateChanged);
    }
    catch (Exception ex)
    {
        LogError(ex, ErrorReference.EndpointEstablishFailed);
    }
}, null);

在客户端中,当您离线或遇到错误时,您的存在反映了这一点(大多数情况下)。这会让您相信存在[1]的状态部分在某种程度上与实际可用性有关。

当你使用UCMA时,你可以最终控制与你的端点相关的一切。正如您所看到的,您可以让UCMA应用程序做一些在常规客户端中不可能做的事情。您不必发布任何存在状态(让您对用户"离线"),但该服务仍然可以发送/接收即时消息。而且,正如您所看到的,您的服务可以"可用",但。。。没有能力做任何事情,但发布其状态[2]。

如果您未能连接适当的模式(在您的情况下为IM),或者您的应用程序遇到异常,导致特定模式不再工作(我怀疑这可能是您的实际问题),您的服务状态仍将为可用

UserEndpoint上的Begin/EndTerminate应自动为您发布Offline,而发布Available以外的状态是确保该状态在应用程序的生命周期内不会"可用"的唯一方法(即使在应用程序过早结束/终止之后,尽管服务器有时会纠正这种情况——有时)。

以下是我攻击解决此问题的方法。忽略存在问题并忽略错误。它们是红鲱鱼。许多问题会导致"不可用或脱机"消息,而这些消息与实际停止的服务无关。

相反,弄清楚为什么你的电话没有接通。

如果在收到错误之前调用需要一段时间,请检查死锁或线程池没有空间容纳另一个线程的情况。故障排除包括检查代码中的竞争条件以及多线程应用程序给您带来的无数其他问题。如果IMCall立即失败,请检查处理来电的部分。在后一种情况下,您的订阅可能已取消(此处列出的原因太多,其中大多数与.Net有关,而不是与UCMA有关),或者您的服务可能已失效。

如果存在性对应用程序的重要性仅在于当它实际能够发送/接收IM时显示为"可用"或"脱机",则您需要确保应用程序在拆卸过程中正确终止端点(包括在出现严重故障的情况下:catch terminate rethrow或任何适合您的情况的方法)。

[1] 在考虑与Lync相关的术语"存在"时要小心。Presence包含可用性状态、特定模式状态、功能(IM/Voice等)、"备注"和联系信息。

[2] 这似乎是一件奇怪的事情,然而,它让我能够使用ApplicationEndpoint报告web服务(与Lync无关)的可用性,我希望能够在移动客户端中查看该服务,而无需通过VPN连接。当做这样的事情时,发布端点的功能非常重要——这将向连接的客户端明确表示您的服务可以做什么,不能做什么

[最后的脚注]有几种方法可以发布存在感。如果您只是想告诉用户"服务在这里"/"服务不在这里",那么您用于发布的机制是最简单、最合乎逻辑的:端点的简化呈现发布

最新更新