【问题标题】:How to connect To Skype For Business using UCMA如何使用 UCMA 连接到 Skype For Business
【发布时间】:2018-07-20 08:14:50
【问题描述】:

当我从 Windows 服务项目调用 LyncClient.Get() 时遇到问题,我知道如果我在控制台应用程序上测试它会运行良好。

 var lyncClient = LyncClient.GetClient();
            Dictionary<PublishableContactInformationType, object> statusData =
                new Dictionary<PublishableContactInformationType, object>
                {
                    {PublishableContactInformationType.LocationName, _position},
                    {PublishableContactInformationType.Availability, ContactAvailability.Busy}
                };

我得到的例外是:

Microsoft.Lync.Model.ClientNotFoundException:主机进程未运行 在 Microsoft.Lync.Model.LyncClient.EnsureOI () 到 Microsoft.Lync.Model.LyncClient.GetClient (Boolean sideBySideLync)

在进行研究时,我在 Windows 服务中读到,我们无法通过调用 GetClient() 来获取 Lync 客户端,因为服务进程和 Lync 进程处于不同的会话中,这就是我尝试使用 UCMA 或 UCWA 的原因,但我不明白它是如何工作的!

【问题讨论】:

    标签: c# .net windows-services skype-for-business ucma


    【解决方案1】:

    我在我的应用程序中尝试做的是从服务中更改 Skype 用户的位置。由于无法使用 Lync Client SDK 进行操作,因此我必须使用 UCWA SDK,但我找不到可以跟随他的示例,建议!

    【讨论】:

      【解决方案2】:

      你说的不是UCMA,你说的是Lync Client SDK

      您可以将 SDK 视为这样:

      • Lync 客户端 SDK

      此 SDK 允许您远程控制标准的“Lync 客户端”。您可以使用此 SDK 自动化 Lync 客户端,让用户可以做任何您可以做的事情或扩展 Lync 客户端的功能(有点受限)。要使用此 SDK,Lync 客户端必须在您希望自动化/扩展的用户中运行。您不能真正在 Windows 服务上下文中运行它。

      所有 Lync 客户端应用程序也“共享”一个 Lync 客户端“会话”。

      可以选择在“side by side”模式下运行 Lync Client SDK,但该模式非常有限(即没有 UI),并且在大多数情况下没有那么有用。

      • UCMA

      此 SDK 是 SIP 端点 SDK。它允许您创建和使用两种主要类型的 SIP 端点:

      • 用户端点
      • 受信任的应用程序端点

      使用 sip 端点,您几乎可以执行 Lync 客户端 SDK 在自动化 Lync 客户端时可以执行的所有操作(即拨打电话、接听电话、设置在线状态、订阅在线状态更改等)。有一些限制,不支持视频通话。使处理某些情况变得更加困难。

      UCMA 允许您创建“受信任的应用程序”,允许您创建用于扩展 S4B 基础架构的 sip 端点。 “受信任的应用程序”/“受信任的应用程序端点”在 S4B 中是“受信任的”,并且允许执行您通常无法使用简单的 UCMA 应用程序执行的操作,例如IVR

      所以这取决于你要做什么取决于你应该使用什么 SDK。

      UCMA 应用程序可以在 Windows 服务应用程序中使用。

      UCWA 是 UCMA(一种)的 Web SDK 版本。 UCWA 比 UCMA SDK 受到更多限制,但 UCWA 适用于 Skype for Business Online,而 UCMA 不直接适用于 Skype for Business Online。您可以使用联合使 UCMA 与 Skype for Business Online 一起使用,但这需要将本地 S4B 设置联合到 Skype for Business Online,这需要大量工作。

      更新: 要回答评论问题,位置是“presence”的一部分。所以设置位置需要做的就是用一个位置来设置当前的存在。对于 UCWA,请参阅此 MSDN 链接以设置 presence。按照示例,将您使用的链接更改为“location”href 并发布如下内容:

      {"location":"my new location"}
      

      【讨论】:

      • 我在我的应用程序中尝试做的是从服务中更改 Skype 用户的位置。由于无法使用 Lync Client SDK 进行操作,因此我必须使用 UCWA SDK,但我找不到可以跟随他的示例,建议!
      • @Dida 你说的“换个位置”是什么意思? AFAIK 对于在 S4B 中称为“位置”的用户没有此类数据。您是指用户“存在”还是某种“存在”子数据,例如“位置”、“状态”等?
      • 我说的是位置,我创建了一个程序,可以自动识别公司内部人员的位置。所以我创建了一个服务来检索位置并在 Skype 上更新它!
      【解决方案3】:

      您为什么使用服务来做这件事?您可以使用在后台运行且不可见的小型控制台应用程序来完成此操作,并在会话启动时启动。 这样您就不需要知道用户的登录名/密码,您只需要轮询您的代码即可等待 Skype for Business 客户端启动(我假设会在会话开始后不久)

      这是我的意思的一个例子:

      class Program
      {
          [DllImport("user32.dll")]
          static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
      
          [DllImport("Kernel32")]
          private static extern IntPtr GetConsoleWindow();
      
          const int SW_HIDE = 0;
      
          static void Main(string[] args)
          {
                  // Let's hide the console window first ...
                  IntPtr hwnd;
                  hwnd = GetConsoleWindow();
                  ShowWindow(hwnd, SW_HIDE);
      
                  // I recommend you start a separate thread from here, I removed it for the sake of simplicity
                  Boolean clientConnected = false;
      
                  while (!clientConnected)
                  {
      
                     try
                     {
                        LyncClient lyncClient = LyncClient.GetClient();
                        clientConnected = true;
      
              // Do your stuff here...
      
                     }
                     catch (ClientNotFoundException ex)
                     {
                        // Client not found : the client is probably not running...
                        // There is nothing to do besides wait and expect to have the user starting his client...
                        clientConnected = false; // not needed, just to highlight the fact that we are not connected yet
      
                     }
                  // Don't forget to make your application sleep/do nothing on regular intervals to avoid taking 100% CPU time while you are polling
                 }
      }
      

      当然,用户可以通过查看他们的任务管理器手动终止应用程序,但大多数最终用户不会这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多