Lync UserEndpoint 对用户显示为联机但无法调用
Lync UserEndpoint appears online to users but can't be called
我有一个基于 Lync 2013 的应用程序:
- 连接到 UserEndpoint(以下简称 CallCenter)
根据 bla bla bla 业务逻辑重定向对 CallCenter 的呼叫。
- 有时,用户会在其标准 Lync 2013 客户端中看到 CallCenter 在线,但如果该用户尝试使用 CallCenter 发起 IM 呼叫,则用户会收到消息 "We couldn't send this message because CallCenter is unavailable or offline."
我无法确定导致此问题的过程,但如果它发生在一个用户身上,那么所有其他用户在尝试呼叫 CallCenter 时都会遇到同样的问题。我能够恢复 CallCenter 的唯一方法是重新启动我的应用程序。与 CallCenter 的定期交互随后会毫无问题地恢复。
如果CallCenter确实是"unavailable or offline",那为什么它的在线状态显示为"Online"?是否需要经常更新/保持 CallCenter 的连接?
作为参考,我是这样连接 CallCenter 的:
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 应用程序执行在常规客户端中不可能执行的操作。您不必发布任何 状态(将您"offline" 留给您的用户),但该服务仍然可以send/receive 即时消息。而且,正如您所看到的,您的服务可以是 "Available" 但......没有能力做任何事情 但 发布其状态 [2].
如果您未能连接适当的模态(在您的情况下是 IM),或者您的应用程序遇到异常导致特定模态不再工作(我怀疑这可能是您的实际问题),状态您的服务仍将 可用。
UserEndpoint 上的 Begin/EndTerminate 应该自动为您发布 Offline 并且发布 Available 以外的在线状态是保证在线状态不会 "Available" 在您的应用程序的生命周期内的唯一方法(甚至在应用程序 ends/dies 过早之后,虽然这有时会被服务器纠正 -- 有时 ).
下面是我将如何解决这个问题。忽略存在性问题并忽略错误。他们是红鲱鱼。许多问题导致 "unavailable or offline" 消息与实际停止的服务无关。
相反,找出您的电话无法接通的原因。
如果调用需要一段时间才能收到错误,请检查是否存在死锁或线程池没有空间容纳另一个线程的情况。故障排除涉及检查您的代码以了解竞争条件以及多线程应用程序抛出的无数其他问题。如果 IMCall 立即失败,请检查处理来电的部分。在后一种情况下,您的订阅可能消失了(这里列出的原因太多,其中大部分与 .Net 相关,与 UCMA 无关),或者您的服务可能已失效。
如果存在对您的应用程序的重要性只是在它实际上能够 send/receive IM 时将其显示为 "available" 或 "offline",您将需要以确保您的应用程序在拆卸期间正确终止端点(包括在严重故障的情况下:catch-terminate-rethrow 或任何适合您的情况)。
[1] 考虑术语 "presence" 时要小心,因为它与 Lync 相关。 Presence 包含可用性状态、特定于模式的状态、功能(IM/Voice 等)、"note" 和联系信息。
[2] 这似乎是一件奇怪的事情,但是,它使我能够使用 ApplicationEndpoint 来报告我希望能够查看的 Web 服务(与 Lync 无关)的可用性在移动客户端中,无需通过 VPN 连接。执行此类操作时,发布端点的功能非常重要——这将明确向连接的客户端发出您的服务可以做什么和不能做什么的信号。
[Final Footnote] 有几种发布状态的方法。如果您只是想告诉您的用户 "service is here"/"service is not here" ,您使用的发布机制是最简单和最合乎逻辑的,这里有很好的记录:Simplified Presence Publication for Endpoints
我有一个基于 Lync 2013 的应用程序:
- 连接到 UserEndpoint(以下简称 CallCenter) 根据 bla bla bla 业务逻辑重定向对 CallCenter 的呼叫。
- 有时,用户会在其标准 Lync 2013 客户端中看到 CallCenter 在线,但如果该用户尝试使用 CallCenter 发起 IM 呼叫,则用户会收到消息 "We couldn't send this message because CallCenter is unavailable or offline."
我无法确定导致此问题的过程,但如果它发生在一个用户身上,那么所有其他用户在尝试呼叫 CallCenter 时都会遇到同样的问题。我能够恢复 CallCenter 的唯一方法是重新启动我的应用程序。与 CallCenter 的定期交互随后会毫无问题地恢复。
如果CallCenter确实是"unavailable or offline",那为什么它的在线状态显示为"Online"?是否需要经常更新/保持 CallCenter 的连接?
作为参考,我是这样连接 CallCenter 的:
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 应用程序执行在常规客户端中不可能执行的操作。您不必发布任何 状态(将您"offline" 留给您的用户),但该服务仍然可以send/receive 即时消息。而且,正如您所看到的,您的服务可以是 "Available" 但......没有能力做任何事情 但 发布其状态 [2].
如果您未能连接适当的模态(在您的情况下是 IM),或者您的应用程序遇到异常导致特定模态不再工作(我怀疑这可能是您的实际问题),状态您的服务仍将 可用。
UserEndpoint 上的Begin/EndTerminate 应该自动为您发布 Offline 并且发布 Available 以外的在线状态是保证在线状态不会 "Available" 在您的应用程序的生命周期内的唯一方法(甚至在应用程序 ends/dies 过早之后,虽然这有时会被服务器纠正 -- 有时 ).
下面是我将如何解决这个问题。忽略存在性问题并忽略错误。他们是红鲱鱼。许多问题导致 "unavailable or offline" 消息与实际停止的服务无关。
相反,找出您的电话无法接通的原因。
如果调用需要一段时间才能收到错误,请检查是否存在死锁或线程池没有空间容纳另一个线程的情况。故障排除涉及检查您的代码以了解竞争条件以及多线程应用程序抛出的无数其他问题。如果 IMCall 立即失败,请检查处理来电的部分。在后一种情况下,您的订阅可能消失了(这里列出的原因太多,其中大部分与 .Net 相关,与 UCMA 无关),或者您的服务可能已失效。
如果存在对您的应用程序的重要性只是在它实际上能够 send/receive IM 时将其显示为 "available" 或 "offline",您将需要以确保您的应用程序在拆卸期间正确终止端点(包括在严重故障的情况下:catch-terminate-rethrow 或任何适合您的情况)。
[1] 考虑术语 "presence" 时要小心,因为它与 Lync 相关。 Presence 包含可用性状态、特定于模式的状态、功能(IM/Voice 等)、"note" 和联系信息。
[2] 这似乎是一件奇怪的事情,但是,它使我能够使用 ApplicationEndpoint 来报告我希望能够查看的 Web 服务(与 Lync 无关)的可用性在移动客户端中,无需通过 VPN 连接。执行此类操作时,发布端点的功能非常重要——这将明确向连接的客户端发出您的服务可以做什么和不能做什么的信号。
[Final Footnote] 有几种发布状态的方法。如果您只是想告诉您的用户 "service is here"/"service is not here" ,您使用的发布机制是最简单和最合乎逻辑的,这里有很好的记录:Simplified Presence Publication for Endpoints