C# Lync UserEndpoint对用户在线显示,但可以';别叫了

C# Lync UserEndpoint对用户在线显示,但可以';别叫了,c#,lync-2013,ucma,C#,Lync 2013,Ucma,我有一个基于Lync 2013的应用程序,它: 连接到UserEndpoint(以下简称呼叫中心) 根据bla bla bla业务逻辑重定向呼叫中心的呼叫 有时,用户会在其标准Lync 2013客户端中看到呼叫中心处于联机状态,但如果该用户尝试使用呼叫中心启动IM呼叫,则用户会收到消息“我们无法发送此消息,因为呼叫中心不可用或脱机。” 我无法确定导致这种情况的过程,但如果发生在一个用户身上,那么所有其他用户在尝试呼叫呼叫中心时都会遇到相同的问题。我能够恢复呼叫中心的唯一方法是重新启动我的应用程序

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

  • 连接到UserEndpoint(以下简称呼叫中心) 根据bla bla bla业务逻辑重定向呼叫中心的呼叫
  • 有时,用户会在其标准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);
    
    UserEndpointSettings设置=新的UserEndpointSettings(userURI、\u ProxyHost、\u ProxyPort);
    settings.AutomaticPresencePublicationEnabled=true;
    settings.Presence.UserPresenceState=PresenceState.UserAvailable;
    _userEndpoint=新的userEndpoint(_Platform.CollabPlatform,设置);
    _userEndpoint.BeginEstablish(res=>
    {
    尝试
    {
    _userEndpoint.EndEstablish(res);
    _userEndpoint.StateChanged+=新事件处理程序(_userEndpoint_StateChanged);
    }
    捕获(例外情况除外)
    {
    LogError(例如,ErrorReference.EndpointFailed);
    }
    },空);
    
    在客户端,当您脱机或遇到错误时,您的状态会反映这一点(大多数情况下都是这样)。这会让您相信状态[1]的状态部分与实际可用性有某种联系

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

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

    UserEndpoint上的Begin/EndTerminate应该为您自动脱机发布,发布除Available之外的状态是保证该状态在应用程序的生命周期内不“可用”的唯一方法(甚至在应用程序过早结束/死亡之后,尽管有时服务器会纠正这一点——有时)

    以下是我如何攻击解决此问题的方法。忽略存在问题,忽略错误。这些都是转移注意力的问题。许多问题会导致“不可用或脱机”消息,与实际停止的服务无关

    相反,找出你的电话无法接通的原因

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

    如果应用程序能够发送/接收即时消息时,显示状态对应用程序的重要性只是将其显示为“可用”或“脱机”,那么您需要确保应用程序在拆卸过程中正确终止端点(包括在发生严重故障的情况下:捕获、终止、重新捕获或任何适合您的情况)

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

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


    [最后一个脚注]发布状态的方法有几种。如果您只是想告诉用户“服务在这里”/“服务不在这里”,那么发布状态的机制是最简单、最合理的这在这里有很好的记录:

    答案很好!事实证明,呼叫中心有时会断开连接(原因是目前正在直接与Microsoft进行调试)在重新布线的过程中,接听来电的人没有重新布线。因此,我可以看到用户在线,但它无法接收来电。